JavaScript 数据类型疑难解答:消除常见的困惑

admin 阅读:168 2024-03-28

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关键字声明常量,使其不能重新赋值。
  • 避免使用==运算符进行相等比较,而始终使用===
  • 了解undefinednull之间的区别。
声明

1、部分文章来源于网络,仅作为参考。
2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!