本章的主要内容:语法、数据类型、流控制语句
一、基本语法
1、ECMAscript中一切都区分大小写。
2、标识符的组成:字母、数字、下划线、美元符,其中数字不能作为第一个字符。不能用关键字与保留字作标识符。
3、关键字与保留字:有特殊用途,比如用作声明的let、var,用作流程控制的if、else、return等等。
4、注释:单行// 多行/* */
二、变量与变量的声明
| var | let | const | |
|---|---|---|---|
| 声明类型 | 变量 | 变量 | 常量 |
| 作用域 | 函数级 | 块级 | 块级 |
| 声明提升 | √ | × | × |
| 重复声明 | √ | × | × |
1、什么是声明提升
即把所有变量的声明(不包括赋值)都放到作用域的顶部。由function关键字声明的函数会整体提升。let、const没有提升,声明前的瞬间称为暂时性死区。
2、块级作用域
JavaScript根据{}来判断块级作用域,如果省略了{},则JavaScript引擎认为没有块级作用域。
3、全局声明
用var声明的全局变量会成为window对象的属性,let不会。
4、const声明
const声明与赋值必须同时进行。但常量并非完全不能改变,改变内部属性是可以的。
5、循环中的let声明
用var定义的迭代变量会溢出到循环体外:
for (var i = 1; i < 3; i++) { }
console.log(i) //3
for (var i = 1; i < 3; i++) {
setTimeout(() => {
console.log(i) //3 3
})
}
使用let之后,循环外无法再访问到迭代变量:
for (let i = 1; i < 3; i++) { }
console.log(i) //ReferenceError: i is not defined
for (let i = 1; i < 3; i++) {
setTimeout(() => {
console.log(i) //1 2
})
}
为了更直观的理解,我们可以画两张图,每一个方块代表一次循环:
从下图可以看出,当使用的是var声明时,由于var是函数级作用域,因此执行超时逻辑时,程序会顺着作用域链找到同一个i,而i此时早已变成了3,因此会打印出两个3。而当使用let声明时,JavaScript引擎会为每次循环声明一个新的i,由于let是块级作用域,因此每个i之间都互不关联,所以执行超时逻辑时,会找到各自的i,因此会分别打印出1、2。
三、数据类型
JavaScript中一共有7种数据类型:
- Number
- String
- Boolean
- Null
- Undefined
- Symbol
- Object
但比较让人困惑的是,typeof操作符返回的类型并不能跟以上7种一一对应。typeof操作符一共也可以返回7种类型:
- number
- string
- boolean
- undefined
- symbol
- function
- object
可以注意到,null不见了,因为它被归到了object里面,因为它可以被看成一个空对象。而原本作为对象的函数被单独分了出来。
下面对每一种类型简单介绍一下:
1、Undefined
此类型只有一个值,就是undefined。由null派生而来。null == undefined。
2、Null
此类型也只有一个值,就是null。若知道变量将来要存放对象,则推荐用null来初始化。
3、Number
JS中数值的范围是Number.MIN_VALUE ~ Number.MAX_VALUE。超出这个范围的值以±Infinity表示。
由于内存的原因,JS会想方设法将数字转为整数处理。小数点后至少包含6个0的数值会转为科学计数法。比如:
console.log(10.0) //10
console.log(0.00000003) //3e-8
另外,由于精度原因,最好不要测试某个特定的浮点值:0.1 + 0.2 = 0.30000000000000004。
NaN是一个特殊数值、用于表示本该返回数值但失败了。它的两个特性是:
- 任何涉及NaN的数值操作始终返回NaN
- NaN不等于任何值,包括它自己
Number类型涉及到的方法:
| 方法 | 作用 |
|---|---|
| isFinite() | 判断值是否有限大 |
| isNaN() | 判断值是否为NaN |
由于转型函数多且复杂,我将它们放在下一篇文章中统一介绍。
4、String
① 字符字面量
一些有特殊用途的字符,比如 ",当不能直接出现在字符串中时,则需要用它们的字面量来表示。
\ n \ ' \ " \ \
当他们出现在字符串中,只算作一个字符。
② 模板字符串
可换行,可插值,${}中可以是任何表达式。
5、Boolean
只有两个值: true和false。
6、Object
每个object实例都有以下属性或方法:
| 方法 | 作用 |
|---|---|
| constructor | |
| hasOwnProperty() | 判断对象本身上是否有某个属性 |
| isPrototypeOf() | 判断对象是不是另一个对象的原型 |
| propertyIsEnumerable() | 判断某个属性能否被for-in枚举 |
| toString() | 返回对象的字符串表示 |
| valueOf() | 返回对象的字符串、数值、布尔值表示 |