JavaScript的类型系统看似简单,实际藏着不少容易被忽视的细节。js中六种基本数据类型分别是undefined、null、Boolean、Number、String和Symbol,它们与引用类型最本质的区别在于存储方式:基本类型的值直接保存在栈内存中,按值访问,赋值和传参时会完整复制一份副本。理解这六种类型是掌握类型判断、隐式转换乃至后续深入学习TypeScript的基础,下面逐个展开分析。

一、undefined与null:两个表示“空”的类型到底差在哪
undefined和null都表示“没有值”,但语义完全不同。undefined表示变量已声明但尚未赋值,是系统层面的空;null则表示人为设置的空值,是程序层面的空。比如声明var a;之后访问a会得到undefined,而var b = null;则明确表达了b当前不指向任何对象。
一个经典的历史遗留问题值得注意:typeof null返回的是字符串"object"而不是"null"。这是因为JavaScript最初实现时,类型标签的低位被用来标记类型,对象标签是000,而null在机器码中恰好是空指针,低位全为0,于是被误判成了对象。这个结果保留至今,判断null时不能依赖typeof,推荐使用x === null进行严格比较。
var a; console.log(typeof a); // "undefined" console.log(typeof null); // "object",历史遗留问题 console.log(null == undefined); // true,宽松相等 console.log(null === undefined); // false,类型不同
实际开发中有一个常见约定:变量声明后暂时没有值时可以初始化为null,表示“等待赋值”;而undefined一般交给引擎自己产生,不要手动赋值,这样代码语义会更清晰。
二、Number、String与Boolean:三种最常用的类型
Number是js中的双精度64位浮点数类型,整数和小数都属于它。由于采用IEEE 754标准存储,js存在著名的精度问题:0.1 + 0.2 === 0.3的结果是false。此外Number类型还有几个特殊值需要牢记:NaN表示非数字,它是唯一一个不等于自身的值;Infinity表示无穷大;Number.MAX_SAFE_INTEGER是安全整数上限,超过它的大数运算建议使用BigInt。
String类型用于表示文本,具有不可变性。任何对字符串的修改操作,如slice、replace、拼接等,都不会改变原字符串,而是返回一个新字符串。js中单引号和双引号没有区别,ES6引入的模板字符串还支持变量嵌入和多行书写,使用起来更加灵活。
Boolean只有true和false两个值,但几乎所有值都能被转换为布尔值。js规定了八个假值:false、0、-0、0n、""、null、undefined、NaN,其余全是真值。特别要注意空数组[]和空对象{}都是真值,这是很多人在条件判断中踩过的坑。
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(NaN === NaN); // false
console.log(Number.isNaN(NaN)); // true,正确的判断方式
console.log(Boolean([])); // true,空数组是真值
console.log("5" + 3, "5" - 3); // "53" 和 2,加减号转换规则不同三、Symbol与类型判断技巧
Symbol是ES6新增的基本类型,用来创建独一无二的值。即使两个Symbol的描述文字完全相同,它们也不相等:Symbol('id') === Symbol('id')返回false。这个特性让它特别适合作为对象的属性名,可以有效避免第三方库扩展对象时属性名冲突的问题。很多内置机制也依赖Symbol实现,比如Symbol.iterator定义了对象的迭代行为,Symbol.toStringTag影响Object.prototype.toString的输出结果。
关于类型判断,typeof是第一选择,但它只能准确区分除null之外的基本类型,遇到函数返回"function",其余引用类型一律返回"object"。判断null可以用严格相等,判断数组用Array.isArray,需要精确获取任意值的类型时,Object.prototype.toString.call是最可靠的方案。
const s1 = Symbol("id");
const s2 = Symbol("id");
console.log(s1 === s2); // false,每个Symbol都独一无二
const obj = { [s1]: "用户标识" };
console.log(obj[s1]); // "用户标识"
// 通用的类型判断方法
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
console.log(getType(null)); // "null"
console.log(getType([])); // "array"
console.log(getType(/abc/)); // "regexp"掌握这六种基本类型之后,再面对隐式转换、深浅拷贝、类型判断等经典问题时就有了理论支撑。基本类型按值传递、引用类型按引用传递这一根本区别,是理解后续众多js行为的钥匙,建议结合实际代码多动手验证,加深记忆。
js基本数据类型JavaScript数据类型typeof修改时间:2026-09-14 04:26:28