计算机由硬件和软件组成
硬件系统:
输出设备:屏幕,音响,打印机,其他
软件系统:
操作系统
语言处理程序
数据库管理系统
其他
应用程序
工具程序
其他
- 计算机内部由二进制0和1表示数据
- 所有数据,包括图片、文件等数据最终都会以二进制数据保存在硬盘中。
- 所有程序,包括操作系统,本质上都是各种数据,以二进制数据的形式保存在硬盘中。平时所说的安装应用程序,就是将二进制的程序文件复制到硬盘中。
- 硬盘、内存都是保存的二进制数据。
- 位(Bit):1bit可以存储一个0或1,是最小的存储单位
- 字节(Byte):1B=8b
- 千字节(KB):1KB=1024B
- 兆字节(MB):1MB=1024KB
- 吉字节(GB):1GB=1024MB
- 太字节(TB):1TB=1024GB
计算机运行软件的过程:
- 打开某个程序时,先从硬盘中把程序的代码加载到内存中
- CPU执行内存中的代码
注意:之所以要内存的一个重要原因,是因为cpu运行太快了,如果只从硬盘中读数据,会浪费cpu性能,所以,才使用存取速度更快的内存来保存运行时的数据。(内存是电,硬盘是机械)
- 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,最后得到结果的过程。
- 计算机程序:计算机所执行的一系列指令的合集,而程序全部都是用我们所掌握的语言来编写的,所以人们要控制计算机一定要通过计算机语言向计算机发出命令。
- 计算机语言指用于人与计算机之间通讯的语言,它是人与计算机之间传递信息的媒介。
- 计算机语言的种类可以分成机器语言,汇编语言和高级语言三大类。
- 计算机最终所执行的都是机器语言,它是由0和1组成的二进制数,二进制是计算机语言的基础。
高级语言所编制的程序不能直接被计算机识别,必须经过转换才能被执行,为此,我们需要一个翻译器。翻译器可以将我们所编写的源代码转换为机器语言。
- 翻译器翻译的方式有两种:一个是编译,另外一个是解释。两种方式之间的区别在于翻译的时间点不同
- 编译器是在代码执行之前进行编译,生成中间代码文件,然后运行中间代码文件,转换成机械语言后执行
- 解释器是在运行时进行及时解释为机械语言,并立即执行
- Javascript是一个脚本语言,可跨平台,支持面向对象
- 脚本(script)简单地说就是一条条的文本命令,按照程序流程执行
- 常见的脚本语言:Javascript、VBscript、Perl、PHP、Python等
- 非脚本语言:C、C++、Java、C#等
- 脚本语言与非脚本语言的区别: 非脚本语言一般需要编译、链接,生成独立的可执行文件后才能运行。 脚本语言依赖于解释器,只在被调用时自动进行解释或编译
- Javascript语言不依赖操作系统,仅需要浏览器的支持
Javascript由三部分组成:ECMAscript、DOM、BOM
ECMA 欧洲计算机制造联合会
网景:Javascript
微软:Jscript
定义了Javascript的语法规范
Javascript的核心,描述了语言的基本语法和数据类型,ECMAscript是一套标准,定义了一种语言的标准与具体实现无关
一套操作页面元素的API(API(Application Programming Interface,应用程序接口))
DOM可以把HTML看做是文档树,通过DOM提供的API可以对树上的节点进行操作。
一套操作浏览器功能的API(接口-类库-方法),通过BOM可以操作浏览器窗口,比如:弹出框、控制浏览器跳转、获取分辨率等。
- 使用 javascript: 前缀构建执行 Javascript 代码的 URL
所有可以设置 URL 的地方都可以使用这种以 javascript: 作为前缀的 URL,当用户触发该 URL 时,javascript: 之后的 JS 代码就会获得执行
- 将 JS 代码写到元素的事件属性值中
这两种方式只适用于代码量比较少的时候,如果代码比较多,建议使用内部代码或写到单独的 JS 文件中
如果页面需要中包含大量的 Javascript 代码,则建议将这些Javascript脚本放在 <script> 标签中。<script> 元素即可作为 <head> 的子元素,也可作为 <body> 的子元素,通常位于<body>元素闭合标签的前面。
为了让 HTML 页面和 Javascript 脚本更好地分离,我们可以将 Javascript脚本单独保存在一个 .js 文件中,HTML 页面导入该 .js 文件即可
注意:
- 由于现代网页开发提倡结构、样式、行为的分离,即分离HTML、CSS、Javascript三部分的代码,避免直接写在HTML标签的属性中,从而更有利于维护。因此在实际开发中不推荐使用行内式
- 存在的问题:引入Javascript代码时,页面的下载和渲染都会暂停,等待脚本执行完成后才会继续(内嵌式或外链式)
- 解决的办法:对于不需要提前执行的代码,将<script>标签放在<body>标签的底部,可以减少对整个页面下载的影响
Window 对象表示浏览器中打开的窗口。
在页签浏览器(比如 Chrome)中,浏览器会为 HTML 文档创建一个 window 对象,每个页签具有自己的 window对象。同一个窗口的页签之间不会共享一个 window 对象。window对象给我们提供了一些方法、属性和事件
window对象是BOM的顶层(核心)对象,其他对象都是以属性的方式添加到window对象下,称为window的子对象。
-
window对象的console属性也是一个对象,它提供了几个可以在控制台输出信息的方法。
-
再例如:window对象的document属性是非常重要的对象,每个载入浏览器的 HTML 文档都会成为 document 对象。
-
document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问。
标识符就是指变量、函数、属性、或者函数参数的名字
定义规则:
- 由大小写字母、数字、下划线和美元符号($)组成。
- 不能以数字开头
- 不能使用Javascript中的关键字命名
- 严格区分大小写
- 尽量见名知意
这些标识符已经被 ECMAscript 收录(使用)了,它们被赋予特殊的意义(功能)了,所有我们不能使用它们作为标识符。
break
虽然这些标识符并没有被 ECMAscript 收录,但是将来的某个时候,可能会被ECMAscript 收录,变成关键字,也就是说,这些标识符已经被预定了,因此我们也不能使用它们。
- Javascript对换行、缩进、空格不敏感。也就是说:
- 每一条语句末尾要加上分号,虽然分号不是必须加的,但是为了程序今后要压缩,如果不加分号,压缩之后将不能运行了。
- 所有的符号,都必须是是英文的。比如括号、引号、分号。
-
变量是一种使用方便的占位符,用于引用计算机内存地址,该地址可以存储script运行时可更改的程序信息,存放数据的容器。
-
语法:Javascript中变量通常利用var关键字声明,并且变量名的命名规则与标识符相同。要声明一个变量你需要首先使用关键字 var,然后输入任何你想要的名称,但是要符合标识符的命名规则
-
命名规则:当标识符中需要多个单词进行表示时,常见的表示方式有下划线法(如user_name)、驼峰法(如userName)和帕斯卡法(如UserName)。读者可根据开发需求统一规范命名的方式,如下划线方式通常应用于变量的命名,驼峰法通常应用于函数名的命名等。
7.1.1 如何使用变量
-
var声明变量
-
变量的赋值
-
变量初识化
-
同时声明多个变量
-
同时声明多个变量并赋值
注意点:不声明,直接省略var关键字为变量赋值不会发生错误,但是在函数内部不用var的变量是全局变量
7.1.2 变量在内存中的存储
变量的本质是在内存中申请的一块用来存放数据的空间。
变量被定义之后,你可以通过变量名称读取变量的值:
在变量定义代码之前,通过变量名称读取变量的值
由于变量的声明会被提升到当前作用域的最顶端,而赋值并不会被提升,因此上面的代码输出 undefined。等价于:
-
为什么需要数据类型?
在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型。 简单来说,数据类型就是数据的类别型号。比如姓名“张三”,年龄18,这些数据的类型是不一样的。
-
变量的数据类型
变量是用来存储值的所在处,它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。
-
Javascript是一种弱类型或者说动态类型的语言。在声明变量时,我们不要指定变量的类型,在程序运行过程中,类型会被自动确定。这意味着JS变量的内存空间中可以存放任意类型的数据。
-
基本数据类型:Undefined、 Null、 String、 Number、 Boolean
-
复合数据类型:Object
8.1.1 Boolean 类型
布尔类型表示一个逻辑值,有两个值:true 和 false。
8.1.2 Number类型
数字类型用于表示数值,整数、浮点数(小数),还有一些带符号的值:+Infinity(正无穷大),-Infinity(负无穷大)和 NaN (非数值,Not a Number)。
8.1.3 String类型
字符串类型用于表示文本数据,使用单引号或双引号括起来
声明字符串时,可使用双引号,也可使用单引号,但是推荐使用单引号
转义字符:
在字符串中使用换行、Tab等特殊符号时,也需要利用转义符“”的转义。
符。如“x61”表示“a”
符。如“好”表示“好”
8.1.4 Undefined类型
Undefined 类型只有一个值,即 undefined。任何一个只声明而没有赋值的变量都会被隐式的(自动的)赋值为 undefined
8.1.5 Null类型
Null 类型也只有一个值,即 null。
null是表示缺少的标识,指示变量未指向任何对象。把 null作为尚未创建的对象,也许更好理解。
- 注意点: 与null不同的是,undefined表示没有为变量设置值,而null则表示变量(对象或地址)不存在或无效
在计算机科学中, 对象是指内存中的可以被 [标识符] 引用的一块区域。
在 Javascript里,引用类型的数据指的是各种对象,他们在内存中的存储方式与原始类型的数据不同。
以Object对象为例,Object对象是一组属性的集合。属性包含一个属性名和一个属性值,如下所示:
person变量的存储空间的数据如下:
- typeof操作符
强制转换:编程人员编写代码强制对数据进行转换
隐式转换:不是编程人员刻意去转换的,而是浏览器(JS 解析引擎)帮我们自动转换的
8.4.1其他类型转成Boolean
使用 Boolean( ) 方法将其他类型的数据转换成 Boolean 类型。
下面这些值将被转换成 false
-
undefined
-
null
-
0
-
NaN(不是一个数值)
-
''
下面这些值将被转换成 true。
-
非空字符串
-
非零数字
-
对象
8.4.2其他类型转成Number
转数值型的函数在使用时有一定的区别
8.4.3其他类型转成String
-
使用 String() 方法将其他类型的数据转换成 String 类型。
-
String()函数可以将任意类型转换为字符型;
-
使用toString()将其他类型的数据转换成 String 类型。
-
除了null和undefined没有toString()方法外,其他数据类型都可以完成字符的转换。
8.4.4隐式类型转换
- 利用隐式转换将字符串类型的数据转换成Number类型
-
使用方法时进行隐式类型转换
用于检查其参数是否是非数字值(isNaN() 函数)
isNaN()函数将测试值转换为数字,然后对其进行测试,判断是否=NaN
- 利用隐式转换将其他类型的数据转换成 String类型。
算数运算符和我们在数学中的学的一样,主要用于数值的运算,Javascript中提供的算数运算符有下面这些:
- 特殊情况-字符型数据运算
- 特殊情况-浮点数进行运算
在计算机中四则运算会先将数转成二进制数,再进行运算,有些小数转换成二进制是无限不循环,相加后再转成十进制,计算机显示的位数有限所以会有精度丢失
简单的赋值操作符由等号(=)表示,它的作用就是把右侧的值赋值给左侧的变量,如下所示:
每个算术操作符都有对应的复合赋值操作符,如下表所示:
i++ ++i
- 在不参与运算的情况下:它们都是自增1
- 在参与运算的情况下,++写在后面,先参与运算,然后加1;++写在前面,在参与运算前,i先加1,然后再参与运算
i-- --i
-
在不参与运算的情况下,都是自减1
-
在参与运算的情况下,--写在后面,先参与运算,然后减1;--写在前面,在参与运算前,i先减1,然后再参与运算
逻辑与(&&)
逻辑与操作符由符号 表示,有两个操作数,逻辑与的真值表如下:
逻辑与的操作数不仅仅是布尔值,还可以应用于任何类型的操作数。此时,它遵循下列规则:
-
如果两个操作数被转换成布尔值第一个是 ,则返回第二个操作数;
-
如果两个操作数被转换成布尔值第一个为,则返回第一个操作数;
逻辑与操作属于短路操作,即如果第一个操作数是 ,那么无论第二个操作数是什么值,结果都不可能是true了,即第二个操作数就不进行操作。
逻辑或(||)
逻辑或操作符由两个竖线符号(||)表示,由两个操作数,如下所示:
逻辑或的真值表如下:
与逻辑与操作符一样,逻辑或的操作数也不仅限于布尔值,它也可以是其他类型的操作数。此时,它遵循下列规则:
-
如果两个操作数被转换成布尔值第一个是 ,则返回第一个操作数;
-
如果两个操作数被转换成布尔值第一个为,则返回第二个操作数;
与逻辑与操作符一样,逻辑或操作符也是短路操作符。也就是说,如果第一个操作数的求值结果为true,就不会对第二个操作数求值了。
逻辑非(!)
逻辑非操作符由一个叹号(!)表示,可以应用于 ECMAscript 中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。逻辑非操作符遵循下列规则:
-
如果操作数被转换成布尔值之后是true,直接返回布尔值:false;
-
如果操作数被转换成布尔值之后是false,直接返回布尔值:true;
小于(<)、大于、小于或等于、大于或等于这几个关系操作符用于对两个值进行比较,比较的规则与我们在数学课上学的一样。这几个操作符都返回一个布尔值,看下面的例子:
当参与比较的操作数是非数值类型时,则会先进行数据类型转换,然后再参与比较。比较规则如下:
-
如果两个操作数都是数值,则执行数值比较。
-
如果两个操作数都是字符串,则比较两个字符串对应的字符编码值。
-
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较。
==和===的用法
-
对于基本数据类型来说: ==当类型相等时,判定值是否相等,当类型不相等时,转换成相同的类型后,比较值是否相等。 ===只有当类型相等时,判定值是否相等。
语法:
表达式 ? 如果表达式结果为true,执行这里的代码1 : 如果表达式结果为false,执行冒号后面的代码2 ;
执行顺序:
-
判断条件表达式是否为
-
如果为 ,执行问号()后面的代码
-
如果为 ,执行冒号()后面的代码
常用运算符优先级从高到底
- ( )优先级最高
- 一元运算符 ++ -- !
- 算数运算符 先* / % 后 + -
- 关系运算符 > >= < <=
- 相等运算符 == != === !==
- 逻辑运算符 先&& 后||
- 赋值运算符
根据条件返回的结果(真或假或其它预定义的),来判断下一步要执行的语句,条件可以是任何返回结果是 或 的表达式。如果条件表达式返回的是 ,语句1 会被执行;否则,语句2 被执行。
switch 语句允许用一个表达式的值或一个变量和 标签后面的值相匹配。如果匹配成功,就执行这个 标签后面的代码。
执行顺序:
-
首先会判断第一个 后面的值是否与表达式的结果相等;
-
如果相等,就会执行 后面代码,当遇到 时, 语句停止执行;
-
如果不匹配,接着判断下一个 后面的值;
-
如果所有的 都不匹配, 程序会去执行 后面的代码;
-
switch比较的值是===等关系。
注意:default 语句不是必须的,在不需要的时候可以不写。如果需要的话,应该写在switch语句的最后。
break语句可以在循环体或判断语句中,只要代码遇到break,就会立马结束当前循环或者判断。
语法:
执行顺序:
-
首先进行变量初始化(),通常被用于初始化一个计数器,该表达式可以使用 var 关键字声明新的变量,这个变量帮我们来记录次数。;
-
判断条件表达式是否成立();
-
如果条件成立,则执行循环体内的代码,执行完之后,执行 ,让 自增 1 ,接着再次判断条件表达式是否成立,如此循环往复,直到条件表达式不成立为止;
-
如果条件不成立,则循环体内的代码不会执行,循环结束。
continue语句的作用是终止本次循环,接着进行下一次循环。
语法:
执行顺序:
-
首先判断条件表达式是否成立;
-
如果成立,执行大括号中的代码,然后再次判断条件表达式是否成立;
-
如果不成立,就不执行大括号中的代码,循环结束。
语法:
执行顺序:
-
程序一开始,直接进入循环体内,执行一遍循环体内的代码;
-
判断条件表达式是否成立,如果条件成立,那么继续执行循环体内的代码;
-
如果条件表达式是否成立,那么循环体内的代码就不再执行,循环结束;
流程控制语句会把后面的值隐式转换成布尔类型
- 转换为true 非空字符串 非0数字 true 任何对象
- 转换成false 空字符串 0 null undefined NaN false
概念:数组是存储一系列值的变量集合,可以存储多个值。
数组构成:数组由一个或多个数组元素组成的,各元素之间使用逗号“,”分割。
数组元素:每个数组元素由“索引下标”和“值”构成。
索引下标:简称下标,以数字表示,默认从0开始依次递增,用于识别元素。
值:元素的内容,可以是任意类型的数据,如数值型、字符型、数组、对象等。
使用数组直接量是创建数组最简单、最直观的方法,在方括号中将数组元素用逗号隔开即可
调用构造函数 Array() 是创建数组的另一种方法。
注意:
- 在创建数组时,最后一个元素后的逗号可以省略,也可以存在。
- 直接法“[]”与Array()对象在创建数组时的区别在于,前者可以创建含有空存储位置的数组,而后者不可以。
数组创建完成后,我们可以 [ ] 操作符访问数组中的元素,数组的引用位于方括号左边。 方括号中是一个返回非负整数的任意表达式。使用该语法即可以访问数组中的元素,又可以修改数组中的元素,添加元素。
delete关键字只能删除数组中指定下标的元素值,删除后该元素依然会占用一个空的存储位置
- 每个数组都有一个 length 属性,length 属性值代表数组中元素的个数。
- 修改数组长度
数组的 length 属性不仅可以用于获取数组长度,还可以修改数组长度。
在利用 length 属性指定数组长度是,有以下三种情况
- 设置的length 属性
- 等于数组长度:不变
- 大于数组长度:在后面会出现empty
- 使用 for 循环遍历数组
数组还可以根据维数划分为一维数组、二维数组、三维数组等多维数组
创建二维数组
二维数组遍历
二维数组只需在遍历数组后,再次遍历数组的元素即可
1.7.1 最大值和最小值
1.7.2 冒泡排序
实现原理:在冒泡排序的过程中,按照要求从小到大排序或从大到小排序,不断比较数组中相邻两个元素的值,将值大的元素或最小的元素交换至右端。
算法步骤
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
12.1.1 push()
12.1.2 pop()
12.1.3 unshift()
12.1.4 shift()
-
栈结构特点:先进后出 push() pop()
-
队列结构特点:先进先出 unshift() shift()
12.2.1 includes()
不同参数情况分析:
-
如果start为负值,则从最后一项开始算起,-1为最后一项,-2为倒数第二项。
-
如果 array.length + start为负值,则整个数组都会被搜索。
-
如果start大于等于数组长度 ,则返回 false 。该数组不会被搜索。
12.2.2 indexOf()
不同参数情况分析:
-
如果start为负值,则从最后一项开始算起,-1为最后一项,-2为倒数第二项。
-
如果 array.length + start为负值,则整个数组都会被搜索。
-
如果start大于等于数组长度 ,则返回-1 。该数组不会被搜索。