我明白这不是原始价值的传递方式,但最好的方法是什么呢?有些侦听器设置为观察对象o
,因此我需要n和m始终在对象o
上同步,但我还需要增加数字属性变量,以便我可以根据某些因素传递不同的addOneTo
。
var o = {a: [], b: [], n: 5, m: 6};
function push5To(arr){
arr.push(5);
}
push5To(o.a);
o.a[0]; // 5
function addOneTo(num){
num += 1;
}
addOneTo(o.n);
o.n; // 5 :(
答案 0 :(得分:4)
这是因为javascript数组是通过引用传递的。 o.a
是一个数组。 o.n
不是,这是一个简单的数字。
一种方法是让函数返回一个值,并将值赋给o.n
。或者:
function addOneTo(map,key){
map[key] += 1;
}
addOneTo(o,'n');
另外,当@Phrogz说“装箱子”时,他的意思是,将它包裹在一个物体内。对象通过引用传递。像:
var o = {a: [], b: [], n: {"value":5}, m: 6};
function addOneTo(key){
key.value += 1;
}
编辑:在大多数语言中,没有“按参考传递”。只有“通过价值”。所以在某种程度上,我上面所说的(javascript数组通过引用传递)是错误的。不同的是究竟是通过值传递的内容。对于基元,传递的值是基元的实际值。对于非基元(数组,对象),该值是对象的引用。