第 3 章 基本概念

  • 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、没有重载

  • 后定义的函数会覆盖了先定义的函数

3.8 小结

理解 ECMAScript 及其纷繁复杂的各种细节,是理解其在 Web 浏览器中的实现——JavaScript 的关键

基本数据类型包括 Undefined、Null、Boolean、Number 和 String

未指定返回值的函数返回的是一个特殊的 undefined 值

可以向 ECMAScript 函数传递任意数量的参数,并且可以通过 arguments 对象来访问这些参数

由于不存在函数签名的特性,ECMAScript 函数不能重载

Last Updated: 10/15/2019, 4:55:10 PM