1. 语法
- 最佳实践及注意事项:
- 标识符使用小驼峰
- 始终在控制语句中使用代码块,即使要执行的只有一条语句
2. 关键字和保留字
- 最佳实践及注意事项:
- 不要使用关键字和保留字作为标识符和属性名,以确保兼容过去和未来的ECMAScript版本
3. 变量
- 最佳实践及注意事项:
- 不推荐改变变量保存值的类型
- 不推荐通过省略var操作符定义全局变量。严格模式下会抛出ReferenceError
- 严格模式下不能定义名为eval和arguements的变量,否则会导致语法错误
- 使用let在全局作用域中声明的变量不会成为window对象的属性(var会)
- 对于let,不能依赖条件声明模式
- 使用const声明变量必须同时初始化变量
- 最好不使用var,const优先,let次之
4. 数据类型
- 原始类型:Null, Undefined, String, Boolean, Number, Symbol
- 复杂数据类型:Object
严格来讲,函数也是对象,不代表一种数据类型,但函数也有自己特殊的属性,所以使用typeof校验时,函数返回function以作区分
4.1 Undefined
- 最佳实践及注意事项:
- 默认情况下,任何未经初始化的变量都会取得undefined值
- 一般来说,永远不用显式地给某个变量设置undefined值
- 无论是声明还是未声明,typeof返回的都是字符串"undefined"
- 建议在声明变量的同时进行初始化,这样当typeof返回undefined时就能知道,这是因为指定的变量未声明,而不是声明了未初始化
4.2 Null
- 最佳实践及注意事项:
- typeof null 会返回"object",null值表示一个空对象指针
- 在定义将来要保存对象值的变量时,建议使用null来初始化。这样,只要检查这个变量的值是不是null就可以知道这个变量是否在后来被重新赋予了一个对象的引用
- undefined和null在表面上相等,即undefined == null返回true,而undefined == null返回false
4.3 Boolean
- 最佳实践及注意事项:
- true和false两个布尔值不同于数值,因此true不等于1,false不等于0
- 可以调用Boolean()函数将其他类型的值转换为布尔值
- 像if等流程控制语句会自动执行其他类型值到布尔值的转换
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String1 | 非空字符串 | ""空字符串 |
Number | 非零数值(包括无穷值) | 0、NaN |
Object | 任意对象 | null |
Undefined | N/A(不存在) | undefined |
4.4 Number
- 最佳实践及注意事项:
- 八进制字面量在严格模式下是无效的,会导致JS引擎抛出语法错误
- 正零和负零在所以情况下都被认为是等同的
- 在小数点后面没有数字的情况下,数值就会变成整数,如果数值本身就是整数,只是小数点后面跟着0(如1.0),那也会被转换为整数
- 由于JS使用IEEE754数值,在浮点数的计算中会存在精度问题
- 在ECMAScript中,0、-0或+0相除会返回NaN
- 任何涉及NaN的操作始终返回NaN
- NaN不等于包括NaN在内的任何值
- 建议始终给parseInt()传入第二个参数,即指定进制
- parseFloat()只解析十进制,不能指定进制
4.5 String
- 最佳实践及注意事项:
- 如果字符串中包含双字节字符,那么length属性返回的值可能不是准确的字符数
- 字符串是不可变的,要修改某个变量中的字符串值,必须先销毁原始字符串,再将新值保存到该变量
- 用加号操作符给一个值加上一个空字符串""可以将其转换为字符串
- 所有插入模板字面量的值都会使用toString()强制转换为字符串
- 嵌套的模板字符串`无须转义
- 可以使用默认的String.raw标签函数获取原始模板字面量,即
console.log(`u00A9`); // © console.log(String.raw`u00A9`); // u00A9