数据类型
JavaScript 是动态类型语言:值的类型在运行时确定,同一变量可被赋予不同类型(不推荐依赖这种灵活性)。
原始类型(Primitive)
共七种:undefined、null、boolean、number、bigint、string、symbol。
- 按值传递:赋值、传参会复制内容(
bigint/symbol同理)。 typeof的坑:typeof null === 'object'是历史遗留;应使用 严格相等value === null判断null。
| 类型 | 典型用途 | typeof 结果 |
|---|---|---|
undefined | 未初始化、缺省参数 | "undefined" |
null | 显式空值 | "object" |
boolean | 条件 | "boolean" |
number | IEEE-754 双精度浮点 | "number" |
bigint | 任意精度整数 | "bigint" |
string | 文本 | "string" |
symbol | 唯一键、元编程 | "symbol" |
number 补充
NaN:Number.isNaN(x)比全局isNaN更可靠(后者会先ToNumber)。Infinity、-Infinity:除零等产生。- 安全整数:
Number.MIN_SAFE_INTEGER~Number.MAX_SAFE_INTEGER,超出可能丢精度。
bigint 与 number
不可混算,需显式转换;与 JSON 互转时需自行处理(JSON.stringify 对 bigint 默认会抛错)。
引用类型(Object)
包括普通对象、数组、函数、Date、RegExp、Map、Set 等,本质是「一组属性的集合」。
- 按共享引用传递:赋值传递的是引用,修改属性会影响同一对象的其他引用。
typeof:除 function 得到"function"外,其余对象通常为"object"(含null的误判需注意)。
判断「是否为(纯)对象」可结合 Object.prototype.toString.call(x) 或 Array.isArray 等。
包装对象(装箱)
原始类型的 boolean / number / string / symbol 在访问属性时,引擎会临时包装为对应包装类型对象,访问后丢弃。勿手动依赖这种隐式装箱做复杂逻辑。
类型转换(简略)
- 抽象相等
==:会触发隐式转换,规则多,实践中优先使用===/!==。 - 常用:
String(x)、Number(x)、Boolean(x),或字面含义清晰的 API(如parseInt、parseFloat)。
深入理解转换规则有助于读老代码;新代码应以显式、可预测的类型为主。