如今是 2022 年,你不会还搞不懂 JavaScript 数据类型吧?
2023-11-08 16:46:39
众所周知,JavaScript 是一门弱类型语言,对变量不进行类型强制,变量可以随时变成任何类型的值。这种灵活性固然方便,但同时也带来了不可控性,往往容易导致一些奇怪的 bug。
1. NaN 的困惑
NaN(Not-a-Number)是一个特殊的数值,表示一个无效的数字。当一个操作无法产生一个有效的数字时,就会返回 NaN。比如:
console.log(1 / 0); // NaN
console.log("abc" * 10); // NaN
NaN 具有以下特点:
- 与任何值(包括 NaN)进行比较的结果都是 false。
- 不能使用
==
或===
运算符与其他值进行相等比较。 - 可以使用
isNaN()
函数来检测是否为 NaN。
2. 未定义的变量
在 JavaScript 中,未定义的变量的值为 undefined
。当一个变量在声明之前被使用时,或者一个属性在对象中不存在时,都会返回 undefined
。比如:
console.log(x); // undefined
console.log(obj.name); // undefined
需要注意的是,undefined
并不是一个布尔值,在条件判断中会被解析为 false。
3. null 与 undefined
null 和 undefined 都是表示空值,但两者之间有细微的区别:
null
是一个特殊的值,表示一个有意设置为空的值。undefined
表示一个变量还没有被赋值,或者一个属性在对象中不存在。
一般情况下,可以使用 ===
运算符来区分 null
和 undefined
。
4. 布尔值转换
在 JavaScript 中,布尔值有两种:true
和 false
。除了 true
和 false
本身之外,还有很多其他值会被隐式转换为布尔值:
- 数字:0 为 false,其他数字为 true。
- 字符串:空字符串为 false,其他字符串为 true。
- 对象和数组:空对象和空数组为 false,其他对象和数组为 true。
- 函数:所有函数都为 true。
5. 对象的类型
在 JavaScript 中,对象是通过 {}
创建的。对象是一种复合数据类型,可以包含多种类型的值。对象的数据类型可以是:
- 字符串
- 数字
- 布尔值
- 对象
- 数组
- 函数
6. 数组的类型
数组是通过 []
创建的。数组是一种有序的数据结构,可以包含多种类型的值。数组的数据类型可以是:
- 字符串
- 数字
- 布尔值
- 对象
- 数组
- 函数
7. typeof 运算符
typeof
运算符可以返回一个值的类型。比如:
console.log(typeof 1); // "number"
console.log(typeof "abc"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof null); // "object"
console.log(typeof []); // "object"
需要注意的是,null
的类型会被返回为 "object",这是 JavaScript 的一个历史遗留问题。
8. instanceof 运算符
instanceof
运算符可以检测一个对象是否属于某个类的实例。比如:
console.log([] instanceof Array); // true
console.log(new Date() instanceof Date); // true
掌握数据类型,避免 bug
JavaScript 的数据类型非常灵活,也容易出错。充分理解 JavaScript 的数据类型可以帮助你避免许多 bug,写出更健壮的代码。