为何执行swap函数后cat.name输出为Wild?已为feline重新赋值新对象
JavaScript函数参数重新赋值为何不影响原对象
代码示例
var cat = { name: 'Athena' }; function swap(feline) { feline.name = 'Wild'; feline = { name: 'Tabby' }; } swap(cat); console.log(cat.name); // 输出 "Wild"
疑问
执行上述代码后,console.log(cat.name)输出结果为"Wild",但明明在swap函数内为参数feline重新赋值了{name:'Tabby'},为什么原对象cat的name没有变成"Tabby"?
原因解析
这本质是JavaScript引用类型的参数传递规则导致的:
- 当调用
swap(cat)时,函数参数feline拿到的是指向cat对象内存地址的副本。此时feline和cat指向同一个内存中的对象,所以修改feline.name = 'Wild'会直接改变这个共享对象的属性,原cat自然能同步看到这个变化。 - 当执行
feline = { name: 'Tabby' }时,是给feline这个局部变量重新赋值了一个新对象的内存地址。这时候feline的指向和原cat已经完全无关,后续对feline的操作不会影响到原cat对象。
总结:修改参数的属性会影响原对象,但给参数重新赋值新对象,只是改变了参数自身的指向,和原对象彻底脱钩。
内容的提问来源于stack exchange,提问作者Mudassar Mustafai
相关产品推荐
相关产品推荐

