JS数据类型疑问:变量存储对象的表述是否准确
关于JavaScript Object类型变量表述的准确性解答
你的表述完全准确,网上常见的“person是存储了一个对象的变量”是入门阶段为了降低理解门槛做的简化说法,严格来说并不符合JS的底层运行逻辑,你这种抠细节的习惯对打牢基础非常有帮助,完全不是过度深究。
先明确JS的变量存储核心规则:
- JS的7种原始类型(string、number、boolean、null、undefined、symbol、bigint)的值是直接存在栈内存中的,变量本身存储的就是原始值本身
- Object属于引用类型,实际的对象内容是存在堆内存中的,绑定对象的变量在栈内存里只存储指向堆内存中实际对象的引用地址,而非对象本身
对应你给出的代码:
let person = { name: "John", age: 39, };
代码执行时分两步完成:
- 在堆内存中开辟独立空间,存储
{name: "John", age: 39}这个类型为Object的实际值 - 在栈内存中为
person变量分配空间,存入指向上述堆内存对象的引用地址
从ECMAScript语言规范的层面看,你提出的“person是一个引用了数据类型为Object的值的变量”是100%严谨的表述。日常开发交流中用“person存了一个对象”的简化说法不会产生沟通歧义,但如果要理清引用类型和原始类型的本质差异,必须明确“变量存引用、实际对象在堆中”这个核心逻辑。
你可以用几行简单的代码验证这个逻辑:
let person = {name: "John", age: 39}; let anotherPerson = person; anotherPerson.age = 40; console.log(person.age); // 输出结果为40
如果person真的存储了对象本身,那赋值后的anotherPerson应该是一份独立的对象拷贝,修改anotherPerson的属性不会影响person。实际运行的联动修改结果,恰恰证明两个变量存储的是同一个堆内存对象的引用。
内容的提问来源于stack exchange,提问作者Lorenzo Zabot
相关产品推荐
相关产品推荐

