第 3 章 基本概念
![](https://github.com/luohong123/js-advance-program/blob/master/%E7%AC%AC%203%20%E7%AB%A0%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E7%9B%B8%E7%AD%89%E5%92%8C%E4%B8%8D%E7%9B%B8%E7%AD%89.png)
![](https://github.com/luohong123/js-advance-program/blob/master/%E7%AC%AC%203%20%E7%AB%A0%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/%E7%AC%AC%203%20%E7%AB%A0%20%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5.png)
- break
var num = 0
outermost: for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (i == 5 && j == 5) {
break outermost
}
num++
}
}
console.log(num) //55
- continue
var num = 0
outermost: for (var i = 0; i < 10; i++) {
for (var j = 0; j < 10; j++) {
if (i == 5 && j == 5) {
continue outermost
}
num++
}
}
console.log(num) //95
3.1 语法
1、区分大小写
变量、函数名、操作符需要区分大小写
- 如变量 test 和变量 Test 表示不同的变量
函数名不能使用关键字如 typeof
2、标识符
标识符表示变量、函数、属性的名字或者函数的参数
格式规则
- 第一个字符必须是一个字母、下划线(_)或一个美元符号($) - 其他字符可以是字母、下划线、美元符号或数字 - 采用驼峰大小写格式,第一个字母小写,剩下的每一个单词首字母大写如 firstName
3、注释
- 单行注释
- 多行注释(块级注释)
4、严格模式(strict mode)
启用严格模式
- 在代码顶部添加 'use strict'; 这是一个编译指示(pragma),告诉JavaScript 引擎切换到严格模式
5、语句
3.2 关键字和保留字
1、关键字
2、保留字
3.3 变量
var name;
- console.log(name); // undefined
在函数内省略 var 操作符,会创建一个全局变量
给未声明的变量赋值,在严格模式下会抛出 ReferenceError 错误
3.4 数据类型
1、typeof 操作符
返回 undefined
- 如果这个值未定义
返回 boolean
- 如果这个值是布尔值
返回 string
- 如果这个值是字符串
返回 number
- 如果这个值是数值
返回 object
- 如果这个值是 对象或 null
返回 function
- 如果这个值是函数
2、Undefined 类型
- 未初始化的变量会自动被赋予 undefined 值
- 建议不要显式的把变量设置为 undefined
3、Null 类型
- 空对象指针
- 明确的让变量保存 null 值
4、Boolean 类型
使用 Boolean() 转换
- 返回 true - String 任何非空字符串 - Number 任何非零数字值(包括无穷大) - Object 任何对象 - Undefined n/a, not applicable 的缩写,意思是“不适用” - 返回 false - String 空字符串 '' - Number 0 和 NAN - Object null - Undefined undefined
5、Number 类型
(1)浮点数值
- 0.1 加 0.2 的结果不是 0.3,而是 0.30000000000000004 - 浮点数值的最高精度是 17 位小数
(2)数值范围
- Number.MIN_VALUE - 5e-324 - Number.MAX_VALUE - 1.7976931348623157e+308 - 超出数值范围 - 数值将被自动转换成特殊的 Infinity 值 - 数值是负数,被转换成-Infinity(负无穷) - 数值是正数,被转换成 Infinity(正无穷) - 使用 isFinite() 检测是否超出范围,超出返回false,在数值范围内,返回 true
(3)NaN 非数值(Not a Number)
- 使用 isNaN() 检测参数不是数值,返回 boolean - 代码示例 - console.log(NaN == NaN); //false - console.log(25 % 0); // NaN
(4)数值转换
- Number() - Boolean - true 转为 1 - false 转为 0 - null - 返回 0 - undefined - 返回 NaN - 字符串 - 只包含数字 - 省掉第一个 0 - 包含十六进制格式 - 转换为相同大小的十进制整数值 - 空字符串 - 转换为 0 - 其它 - NaN - 对象 - 调用对象的 valueOf(), 再依照前面的顺序返回值 - parseInt() 处理整数 - parseFloat() 处理浮点数
6、String 类型
(1) 字符字面量
- 特殊的字符字面量,也叫转义序列
(2)字符串的特点
- 不可变 - 拼接字符串时速度很慢
(3)转换为字符串
- 使用 toString() 方法 或者 + " " - 规则 - 如果值有 toString()方法,则调用该方法(没有参数)并返回相应的结果 - 如果值是 null,则返回"null" - 如果值是 undefined,则返回"undefined"
7、Object 类型
实例对象包含的属性和方法
- constructor:保存着用于创建当前对象的函数。 - hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例 的原型中)是否存在。 - isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型 - propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用 for-in 语句来枚举 - toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应 - toString():返回对象的字符串表示 - valueOf():返回对象的字符串、数值或布尔值表示。
3.5 操作符
1、一元操作符
(1)递增和递减操作符
- 递增操作符 - i++ - 先使用 i 的值,再计算 - ++i - 先计算,再使用计算后的值 - 递减操作符 - i-- - 先使用 i 的值,再计算 - --i - 先计算,再使用计算后的值 - 计算规则 - 在应用于一个包含有效数字字符的字符串时,先将其转换为数字值,再执行加减 1 的操作 - 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为 NaN - 在应用于布尔值 false 时,先将其转换为 0 再执行加减 1 的操作 - 在应用于布尔值 true 时,先将其转换为 1 再执行加减 1 的操作 - 在应用于浮点数值时,执行加减 1 的操作 - 在应用于对象时,先调用对象的 valueOf()方法以取得一个可供操作的值
(2)一元加和减操作符
- 一元加操作符 - 像 Number()转型函数一样对值执行转换 - 一元减操作符 - 表示负数 - 像 Number()转型函数一样对值执行转换
2、位操作符
(1)按位非(NOT)
- ~
(2)按位与(AND)
- &
(3)按位或(OR)
- |
(4)按位异或(XOR)
- ^
(5)左移
- <<
(6)有符号的右移
- >>
(7)无符号右移
- >>>
3、布尔操作符
(1)逻辑非
- ! 取反 - 规则 - 如果操作数是一个对象,返回 false - 如果操作数是一个空字符串,返回 true - 如果操作数是一个非空字符串,返回 false - 如果操作数是数值 0,返回 true - 如果操作数是任意非 0 数值(包括 Infinity),返回 false - 如果操作数是 null,返回 true - 如果操作数是 NaN,返回 true - 如果操作数是 undefined,返回 true - 两个逻辑非操作符,会模拟Boolean() - 第一个逻辑非操作会基于无论什么操作数返回一个布尔值 - 第二个逻辑非操作则对该布尔值求反
(2)逻辑与
- && - 真值表 - 真真为真,真假为假,假真为假,假假为假 - 规则 - 如果第一个操作数是对象,则返回第二个操作数 - 如果第二个操作数是对象,则只有在第一个操作数的求值结果为 true 的情况下才会返回该 - 如果两个操作数都是对象,则返回第二个操作数 - 如果有一个操作数是 null,则返回 null - 如果有一个操作数是 NaN,则返回 NaN - 如果有一个操作数是 undefined,则返回 undefined
(1)逻辑非
- || - 真值表 - 真真为真,真假为真,假真为真,假假为假 - 规则 - 如果第一个操作数是对象,则返回第一个操作数 - 如果第一个操作数的求值结果为 false,则返回第二个操作数 - 如果两个操作数都是对象,则返回第一个操作数 - 如果两个操作数都是 null,则返回 null - 如果两个操作数都是 NaN,则返回 NaN - 如果两个操作数都是 undefined,则返回 undefined
4、乘性操作符
(1)乘法
- * - 规则 - 如果操作数都是数值,执行常规的乘法计算 - 如果有一个操作数是 NaN,则结果是 NaN - 如果是 Infinity 与 0 相乘,则结果是 NaN - 如果是 Infinity 与非 0 数值相乘,则结果是 Infinity 或-Infinity - 如果是 Infinity 与 Infinity 相乘,则结果是 Infinity - 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则
(2)除法
- / - 规则 - 如果操作数都是数值,执行常规的除法计算 - 如果有一个操作数是 NaN,则结果是 NaN - 如果是 Infinity 被 Infinity 除,则结果是 NaN - 如果是零被零除,则结果是 NaN - 如果是非零的有限数被零除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号 - 如果是 Infinity 被任何非零数值除,则结果是 Infinity 或-Infinity,取决于有符号操作数的符号 - 如果有一个操作数不是数值,则在后台调用 Number()将其转换为数值,然后再应用上面的规则
5、加性操作符
(1)加法
- + - 规则 - 如果有一个操作数是 NaN,则结果是 NaN - 如果是 Infinity 加 Infinity,则结果是 Infinity - 如果是-Infinity 加-Infinity,则结果是-Infinity - 如果是 Infinity 加-Infinity,则结果是 NaN - 如果是+0 加+0,则结果是+0 - 如果是-0 加-0,则结果是-0 - 如果是+0 加-0,则结果是+0 - 一个操作数是字符串 - 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来 - 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来 - 如果有一个操作数是对象、数值或布尔值,则调用它们的 toString()方法取得相应的字符串值, - 然后再应用前面关于字符串的规则。 - 对于 undefined 和 null,则分别调用 String()函数并取得字符 串"undefined"和"null"
(2)减法
- - - 规则 - 如果两个操作符都是数值,则执行常规的算术减法操作并返回结果 - 如果有一个操作数是 NaN,则结果是 NaN - 如果是 Infinity 减 Infinity,则结果是 NaN - 如果是-Infinity 减-Infinity,则结果是 NaN - 如果是 Infinity 减-Infinity,则结果是 Infinity - 如果是-Infinity 减 Infinity,则结果是-Infinity - 如果是+0 减+0,则结果是+0 - 如果是+0 减-0,则结果是0 - 如果是-0 减-0,则结果是+0 - 如果有一个操作数是字符串、布尔值、null 或 undefined,则先在后台调用 Number()函数将 - 其转换为数值,然后再根据前面的规则执行减法计算 - 如果有一个操作数是对象,则调用对象的 valueOf()方法以取得表示该对象的数值 - 如果对象没有 valueOf()方法,则调用其 toString() - 方法并将得到的字符串转换为数值
6、关系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)
规则
- 如果两个操作数都是数值,则执行数值比较 - 如果两个操作数都是字符串,则比较两个字符串对应的字符编码值 - 如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较 - 如果一个操作数是对象,则调用这个对象的 valueOf()方法,用得到的结果按照前面的规则执 - 行比较。如果对象没有 valueOf()方法,则调用 toString()方法,并用得到的结果根据前面的规则执行比较 - 如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
7、相等操作符
(1)相等和不相等
- 先转换再比较,强制转型 - 规则 - 如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false 转换为 0,而true 转换为 1 - 如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值 - 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf()方法,用得到的基本类型值按照前面的规则进行比较 - null == undefined // true - 要比较相等性之前,不能将 null 和 undefined 转换成其他任何值 - 如果有一个操作数是 NaN,则相等操作符返回 false,而不相等操作符返回 true。即使两个操作数都是 NaN,相等操作符也返回 false;因为按照规则,NaN 不等于 NaN - 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true;否则,返回 false
(2)全等和不全等
- 仅比较而不转换 - 由于相等和不相等操作符存在类型转换问题,而为了保持代码中数据类型的完整性,我们推荐使用全等和不全等操作符
8、条件操作符
var max = (num1 > num2) ? num1 : num2;
- 如果 num1 大于 num2(关 系表达式返回 true),则将 num1 的值赋给 max;如果 num1 小于或等于 num2(关系表达式返回 false), 6 则将 num2 的值赋给 max
9、赋值操作符
=
作用
- 把右侧的值赋给左侧的变量
目的是简化赋值操作,但不会带来任何性能提升
10、逗号操作符
- ,
- 用于声明多个变量
- 用于赋值,在用于赋值时,逗号 操作符总会返回表达式中的最后一项
3.6 语句
1、if 语句
- 自动调用 Boolean()转换函数
2、do-while 语句
- 后测试语句
- 对条件表达式求值之前,循环体内的代码至少会被执行一次。
3、while 语句
- 前测试语句
4、for 语句
- 前测试语句
5、for-in 语句
- 精准的迭代语句,可以用来枚举对象的属性
- 在使用 for-in 循环之前,先检测确认该对象的值不是 null 或 undefined
6、label 语句
- 使用 label 语句可以在代码中添加标签,以便将来使用
7、break 和 continue 语句
- break 语句会立即退出循环,强制继续执行循环后面的语句
- continue 语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行,跳过
8、with 语句
作用
- 将代码的作用域设置到一个特定的对象中
不建议使用 with,因为大量使用 with 语句会导致性能下降,同时也会给调试代码造成困难
9、switch 语句
- 在比较值时使用的是全等操作符,不会发生类型转换
3.7 函数
1、严格模式对函数有一些限制
- 不能把函数命名为 eval 或 arguments
- 不能把参数命名为 eval 或 arguments
- 不能出现两个命名参数同名的情况
2、理解函数
- 所有参数传递的都是值,不可能通过引用传递参数
3、没有重载
- 后定义的函数会覆盖了先定义的函数