数据类型

JavaScript 是动态类型语言:值的类型在运行时确定,同一变量可被赋予不同类型(不推荐依赖这种灵活性)。


原始类型(Primitive)

共七种:undefinednullbooleannumberbigintstringsymbol

  • 按值传递:赋值、传参会复制内容(bigint / symbol 同理)。
  • typeof 的坑typeof null === 'object' 是历史遗留;应使用 严格相等 value === null 判断 null
类型典型用途typeof 结果
undefined未初始化、缺省参数"undefined"
null显式空值"object"
boolean条件"boolean"
numberIEEE-754 双精度浮点"number"
bigint任意精度整数"bigint"
string文本"string"
symbol唯一键、元编程"symbol"

number 补充

  • NaNNumber.isNaN(x) 比全局 isNaN 更可靠(后者会先 ToNumber)。
  • Infinity-Infinity:除零等产生。
  • 安全整数Number.MIN_SAFE_INTEGERNumber.MAX_SAFE_INTEGER,超出可能丢精度。

bigintnumber

不可混算,需显式转换;与 JSON 互转时需自行处理(JSON.stringifybigint 默认会抛错)。


引用类型(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(如 parseIntparseFloat)。

深入理解转换规则有助于读老代码;新代码应以显式、可预测的类型为主。


相关链接

  • 原型与继承(对象、[[Prototype]]
  • ES6+SymbolBigInt 等纳入的语言特性)
  • 函数typeof 对函数的特殊性)