JavaScript中原始类型与引用类型的根本区别在于存储方式和赋值/比较行为:原始类型按值存储于栈中,赋值复制值、比较比内容、不可变;引用类型按引用存储,变量存堆内存地址,赋值复制地址、比较比引用、可变。
JavaScript 中的原始类型(Primitive Types)和引用类型(Reference Types)本质区别在于值的存储方式和赋值/比较行为,这直接影响变量操作、内存使用和代码逻辑——不是语法约定,而是底层机制决定的。
原始类型包括 string、number、boolean、null、undefined、symbol、bigint。它们在栈内存中以固定大小直接存储实际值。
===),不涉及内存地址例如:
let a = "hello";
let b = a;
b = "world";
console.log(a); // "hello" — a 不受影响
引用类型包括 object、array、function、date、regexp、map、set 等。变量实际存储的是指向堆内存中对象的引用(指针),而非对象本身。
例如:
let obj1 = { name: "Alice" };
let obj2 = obj1;
obj2.name = "Bob";
console.log(obj1.name); // "Bob" — obj1 也被改了
内存位置:原始类型存栈;引用类型的数据存在堆,变量存栈中的地址。
赋值行为:原始类型是“拷贝值”,引用类型是“拷贝地址”。
函数传参:JS 所有参数都是按值传递;但对引用类型来说,“值”是地址,所以函数内可通过该地址修改外部对象。
检测方式:用 typeof 可区分原始类型(除 null),但 typeof null === 'object' 是历史 bug;判断引用类型更可靠的方式是 Object.prototype.toString.call(value) 或 value instanceof Array 等。
原始类型小而确定,栈存储快且可控;引用类型大小不确定、可能很大,堆分配更灵活。这种分离兼顾了性能与表达力
——既支持高效基础运算,又允许构建复杂、可共享、可扩展的数据结构。