javaScript数据类型分原始类型和引用类型:原始类型共7种(String、number、Boolean、NULL、undefined、symbol、bigint),按值传递;引用类型如Object、Array等,变量存储内存地址,按引用传递。

javascript 数据类型分两类:原始类型(primitive)和引用类型(object)。区别不在“是不是对象”,而在值的存储方式和赋值/比较行为——原始类型按值传递,引用类型按内存地址传递。
原始类型有哪些?注意 null 和 undefined 的特殊性
共 7 种原始类型:string、number、boolean、null、undefined、symbol、bigint。
-
typeof null返回"object",这是历史遗留 bug,但null本质是原始类型 -
undefined是未赋值或未声明变量的默认值;null是开发者显式赋的“空值” -
Symbol()每次调用都生成唯一值,常用于对象属性名防冲突 -
BigInt用后缀n表示,如123n,不能和number混算(123n + 1报错)
引用类型有哪些?Array、function、date 都是 Object 的实例
所有非原始类型的值都是引用类型,底层都继承自 Object。常见包括:
它们共性是:变量存储的是指向堆内存中实际数据的引用(指针),不是数据本身。
立即学习“Java免费学习笔记(深入)”;
赋值和比较时行为差异最直观:看 === 和修改影响
原始类型比较值,引用类型比较地址——哪怕内容一模一样,两个 {} 也不相等。
let a = 42; let b = a; b = 99; console.log(a); // 42 —— 原始类型赋值是拷贝值 let x = { name: "Alice" }; let y = x; // y 和 x 指向同一块内存 y.name = "Bob"; console.log(x.name); // "Bob" —— 修改 y 影响了 x console.log({} === {}); // false console.log([] === []); // false console.log(/a/ === /a/); // false
- 想深拷贝对象,不能只用
jsON.parse(json.stringify(obj)),它会丢掉function、undefined、Symbol、循环引用 -
Object.is(a, b)比===更严格,能区分+0和-0,且Object.is(NaN, NaN)返回true
检测类型别只信 typeof:用 instanceof 或 Object.prototype.toString.call()
typeof 对大部分引用类型都返回 "object",无法区分 Array、Date、null 等。
console.log(typeof []); // "object" console.log(typeof null); // "object" console.log(typeof new Date()); // "object" // 更可靠的方式: console.log(Object.prototype.toString.call([])); // "[object Array]" console.log(Object.prototype.toString.call(null)); // "[object Null]" console.log(Object.prototype.toString.call(undefined)); // "[object Undefined]" // 或用 instanceof(注意跨 iframe 会失效) [] instanceof Array; // true
-
Array.isArray()是检测数组的推荐方式,比instanceof更健壮 -
typeof只对函数准确返回"function",其他引用类型都不可靠
原始 vs 引用的核心不是“能不能改变”,而是“变量里存的是什么”。一个 const obj = {} 不可重新赋值,但 obj.prop = 1 完全合法——因为 const 锁的是绑定,不是对象内容。这点最容易被忽略。