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]" // true4. 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之间的区别。
声明
1、部分文章来源于网络,仅作为参考。 2、如果网站中图片和文字侵犯了您的版权,请联系1943759704@qq.com处理!



