JS数据类型核心在于行为而非罗列:聚焦原始值与引用值、赋值与比较、检测与实际类型的三组关系,结合栈堆内存模型理解本质,掌握Array.isArray()、Object.prototype.toString.call()等精准检测方法,规避==和+的隐式转换陷阱。

直接从行为入手,别先背七种类型——JS 数据类型的核心不在“有哪些”,而在“怎么用、为什么这样用”。学得快的关键是抓三组关系:原始值 vs 引用值、赋值行为 vs 比较行为、检测手段 vs 实际类型。
盯住内存模型,理解赋值和比较的本质
所有困惑都源于没分清栈和堆:
- 基本类型(string、number、boolean、null、undefined、symbol、bigint)存在栈里,赋值=拷贝值,修改互不影响
- 引用类型(object、array、function、Date、RegExp等)实体在堆里,栈中只存地址;赋值=拷贝地址,两个变量指向同一块内存
-
null 是原始类型,但
typeof null返回"object"——这是历史 bug,不用纠结,记住它语义上表示“空对象引用”即可 -
typeof [] 和 typeof {} 都返回
"object",所以不能单靠typeof判断数组或日期,改用Array.isArray()或Object.prototype.toString.call()
掌握类型检测的实用组合拳
别只记 typeof,它在关键地方会“撒谎”:
- 检测是否为 undefined:优先用
typeof x === "undefined"(可安全检测未声明变量) - 检测是否为 null:直接
x === null(它是唯一一个typeof返回"object"的原始值) - 区分 数组:
Array.isArray(x)最可靠 - 识别 日期、正则、Map、Set 等:用
Object.prototype.toString.call(x),它返回"[object Date]"这类标准字符串 - 判断是否为 有效对象(非 null,且是引用类型):
x !== null && typeof x === "object" && !Array.isArray(x)
吃透转换逻辑,避开 == 和 + 的坑
自动转换不是玄学,有明确规则:
-
==会先尝试类型转换再比较,0 == false、"0" == false、[] == false都为true——日常一律用=== -
+运算符:任一操作数是字符串,就全部转字符串拼接;否则尝试转数字(+"123"→123,+[]→0,+{}→NaN) -
Boolean()转换的“falsy 值”只有 6 个:false、0、-0、0n、""、null、undefined、NaN(共 8 个,注意0n是 BigInt 零) - 函数参数默认值、
??(空值合并)、&&/||都基于“真值/假值”判断,不是类型判断
动手验证比死记更重要
打开浏览器控制台,花 10 分钟跑这几行:
typeof null; typeof []; typeof function(){}; typeof Symbol(); typeof 123n;let a = {x:1}; let b = a; b.x = 2; console.log(a.x); // 输出 2let c = "hello"; let d = c; d = "world"; console.log(c); // 输出 "hello"console.log([] == false, {} == false, Boolean({}), Boolean([]));Object.prototype.toString.call(new Date()); Object.prototype.toString.call(/abc/);
每条结果背后都有规范支撑,看到现象,再回头查机制,印象才深。











