为何JavaScript中未直接修改对象,其属性值却发生了更新?
两种赋值表现差异的核心原因是JavaScript的数据类型存储机制不同
原始值类型(数字、字符串、布尔值等)的存储与赋值
- 这类数据直接存储在栈内存中,赋值时会完整复制一份值给新变量,新旧变量各自对应栈内存里的独立空间,修改任意一个都不会影响另一个。
对应你的示例代码:
var a = 45; var b = a; b = 99; console.log(a,b) // 输出45, 99
这里给b重新赋值相当于在栈内存里新开了一块空间存99,和a原本存储的45没有关联,所以a的值不会变。
引用类型(对象、数组、函数等)的存储与赋值
- 这类数据的实际内容存储在堆内存中,栈内存里只保存指向堆内存地址的指针。你执行
basket = obj操作时,只是把obj保存的堆内存地址复制给了basket,两个变量实际指向堆里的同一个对象。
所以不管通过哪个变量修改对象的属性,操作的都是堆内存里的同一个对象,自然另一个变量访问时也会拿到修改后的结果。
对应你的示例代码:
let obj = { apple: 12, mango: 13 }; basket = obj; basket.apple = 45; basket.banana = 15; console.log(obj); // 输出 { apple: 45, mango: 13, banana: 15 }
如果你想要得到两个互不影响的独立对象,可以做对象拷贝:
- 浅拷贝(只拷贝第一层属性,适合没有嵌套对象的场景):可以用
const basket = {...obj}或者const basket = Object.assign({}, obj) - 深拷贝(拷贝所有层级的属性,适合有嵌套对象的场景):可以用
JSON.parse(JSON.stringify(obj))或者自定义深拷贝方法。
内容的提问来源于stack exchange,提问作者Rajashekar Reddy
相关产品推荐
相关产品推荐

