返回

如今是 2022 年,你不会还搞不懂 JavaScript 数据类型吧?

前端

众所周知,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 表示一个变量还没有被赋值,或者一个属性在对象中不存在。

一般情况下,可以使用 === 运算符来区分 nullundefined

4. 布尔值转换

在 JavaScript 中,布尔值有两种:truefalse。除了 truefalse 本身之外,还有很多其他值会被隐式转换为布尔值:

  • 数字: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,写出更健壮的代码。