JavaScript有8种数据类型,分7种基本类型(String、Number、Boolean、undefined、null、Symbol、BigInt)和1种引用类型(Object及其派生类如Array、Function等),核心区别在于存储方式、赋值行为、比较逻辑和可变性。
JavaScript 有 8 种数据类型,分为 基本类型(原始类型) 和 引用类型(对象类型) 两大类。区分它们的关键不在“叫什么”,而在于 存储方式、赋值行为、比较逻辑和可变性。
它们是不可再分的最小单
元,值直接存于栈内存,操作的是值本身:
"hello"、`world`
NaN、Infinity
true 和 false
typeof null 返回 "object",是历史遗留 bug)Symbol() 都生成唯一值,常用于对象属性名防冲突n 表示,如 123n,支持任意精度整数运算本质都是 Object 的实例,实际数据存在堆内存,变量中只保存指向它的地址(引用):
{ name: "Alice", age: 30 }
[1, "a", true](数组也是对象)function fn() {} 或 () => {}
new Date()
/\d+/g
单靠 typeof 不够可靠(比如 typeof null === "object",typeof [] === "object"),推荐组合使用:
typeof:适合快速区分基本类型("string"、"number"、"function" 等),但对 null、数组、普通对象都返回 "object"
instanceof:检查是否为某构造函数的实例,如 [] instanceof Array → true;但跨 iframe 会失效Object.prototype.toString.call(x):最稳妥的标准方法,返回形如 "[object Array]"、"[object Date]" 的字符串,可精准识别所有内置类型Array.isArray()、Number.isNaN()、BigInt.asIntN() 等专用 API:语义明确,优先用于对应场景基本类型按值操作、复制即拷贝一份新值、比较看内容是否相等;引用类型按地址操作、复制只是多一个指针、比较看是不是同一个内存位置——改一个,另一个可能跟着变。