JS有8种数据类型,分7种原始类型(Number、String、Boolean、null、undefined、Symbol、BigInt)和1种引用类型(Object及其衍生如数组、函数等),核心区别在于原始类型存于栈内存、值拷贝,引用类型地址存栈、数据存堆、地址拷贝。

直接从“能用”到“用对”,不绕弯、不堆概念。JS 数据类型的学习关键不在背种类,而在理解“值怎么存、怎么传、怎么变”。下面按实际掌握节奏分四步走,每步都对应真实编码场景。
一、先盯住 5 个最常用原始类型
不用一上来就数清 8 种——string、number、boolean、undefined、null 这 5 个覆盖日常 90% 场景。重点不是记住定义,而是看清它们的行为差异:
-
字符串拼接时自动转数字?比如
"1" + 2得"12",但"1" - 2得-1——加号有“粘合”倾向,减号强制转数字 -
number 里藏着坑:
0.1 + 0.2 !== 0.3;typeof NaN是"number";判断是否为有效数字,优先用Number.isFinite()而非isNaN() -
null 和 undefined 别混用:函数没返回值 →
undefined;主动表示“空对象” →null;用==会相等,但===不等,推荐统一用严格等于
二、动手区分“值传递”和“引用传递”
这是绝大多数 bug 的源头。只靠读文字记不住,必须写两行代码验证:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 基本类型(如 number、string)赋值是“拷贝一份值”:
let a = 10; let b = a; b = 20;→a还是10 - 引用类型(如数组、对象)赋值是“拷贝一份地址”:
let arr1 = [1]; let arr2 = arr1; arr2.push(2);→arr1变成[1, 2] - 想真正复制数组?用
[...arr1]或arr1.slice();对象用{...obj}或Object.assign({}, obj)
三、类型转换别靠猜,掌握三类明确路径
JS 自动转换常让人措手不及。与其被动接受,不如主动控制:
-
转字符串:隐式用
"" + value,显式用String(value)或value.toString()(注意null/undefined会报错) -
转数字:想宽松解析(带字母也尽量转)→
parseInt("12px")得12;想严格校验 →Number("12")得12,Number("12px")得NaN -
转布尔:只有
0、""、null、undefined、NaN、false是假值,其余全为真 ——!![]是true,!!{}也是true
四、进阶一步:看懂 typeof / instanceof / Array.isArray() 的分工
面试爱问,但实际开发中更需知道“什么时候该用哪个”:
-
typeof:适合判断原始类型 ——typeof "hi"→"string",但typeof null是"object"(历史 bug,记得单独处理) -
instanceof:用于检测对象是否由某构造函数创建 ——[] instanceof Array→true,但跨 iframe 失效 -
Array.isArray():唯一可靠判断数组的方式;Object.prototype.toString.call([])更通用,可识别Array、Date、RegExp等
学数据类型不是为了答题,而是为了写出来的代码不意外。每次遇到 undefined is not a function 或 Cannot read property 'xxx' of null,回过头看一眼变量此刻到底是什么类型,比盲目加 ?. 更治本。

















