问题描述
我是Java语言的初学者,只需要澄清一下。我并不是真的想在这里取得任何成就。对此情况有些困惑。
当分配给对象的变量作为参数传递给函数时,我们可以永久更改对象。但是,我们无法重新分配它并使更改保持不变。为什么呢?
以下是我的意思的示例代码:
示例1-突变。
const house = {
color1: 'white',color2: 'blue'
};
let paintIt = obj => {
obj.color1 = 'gold'
};
paintIt(house);
house.color1 // Returns 'gold'
示例2-重新分配。
let house = {
color1: 'white',color2: 'blue'
};
let paintItReassignment = obj => {
obj = {
forSale : false,includesGarden : true
}
console.log(obj) // Prints {'forSale':false,'includesGarden':true}
};
paintItReassigment(house) // The reassignment does not work
house // Still returns {color1:'white',color2:'blue'}
house = {
forSale : false,includesGarden : true
}; // Regular reassignment still works
为什么修改对象属性(示例1)时它会停留,而重新分配它(示例2)时却不会停留?
解决方法
与其他某些编程语言(例如C)不同,JavaScript将混合使用按引用传递系统和按值传递系统用于其函数调用。在函数中,您可以重新分配传递给它的对象的属性,但是不能重新分配对象本身的变量。如果希望重新分配对象变量,可以始终执行以下操作:
o = f(o);
要重新定义多个变量:
var {a,b} = f(a,b)
例如,其中:
function f(a,b){
return {a:b,b:a};
}
有关该主题的一些讨论可以在here中找到。