1. ES6之前与ES6及以后的类型
ES6(2015)引入了一些新数据类型,例如Set、Map和Symbol。这些类型在ES6之前不存在,并且具有不同的特性和用途。例如,Set是一个无序且唯一值无重复的集合,而Map是一个键值对的集合。
2. 基本类型与引用类型
基本类型(值类型):
- 字符串
- 数字
- 布尔
- 空值
- 未定义
引用类型(引用值):
- 对象
- 数组
- 函数
基本类型在内存中独立存储,而引用类型存储指向实际值的指针。当修改引用类型时,将修改实际值,而修改基本类型将创建新值。
3. typeof运算符
typeof
运算符返回一种值的类型。然而,它对对象和数组返回的值不一致:
typeof null
返回"object",尽管null
不是对象。typeof []
返回"object",尽管数组是独立的数据类型。
使用以下方法更可靠地检查类型:
Array.isArray([]) // true
Object.prototype.toString.call(null) === "[object Null]" // true
4. NaN与Infinity
NaN(非数字)和Infinity(无穷大)是特殊数值,表示无效或太大而无法表示的值。它们的行为可能令人困惑:
- NaN与任何值(包括NaN)不等于。
- Infinity比任何其他值都大,除了另一个Infinity值(正无穷或负无穷)。
5. 布尔值与数字
布尔值和数字之间存在隐式类型转换:
true
转换为数字1。false
转换为数字0。
这可能导致意外行为,例如:
if (true + true) { // true
// ...
}
6. 原始值与对象包装器
原始值(字符串、数字、布尔值、null、undefined)有相应的对象包装器(String、Number、Boolean、Object、Undefined)。这可能会导致困惑,因为原始值看起来像对象,但实际上不是:
const str = "hello";
console.log(str.toUpperCase()); // "HELLO"
7. 严格相等(===)与宽松相等(==)
严格相等(===
)比较值和类型,而宽松相等(==
)进行类型转换然后比较。这可能会导致意外结果:
1 == "1" // true (宽松相等)
1 === "1" // false (严格相等)
其他提示
- 使用
Object.freeze()
冻结对象,使其不可变。 - 使用
const
关键字声明常量,使其不能重新赋值。 - 避免使用
==
运算符进行相等比较,而始终使用===
。 - 了解
undefined
和null
之间的区别。