【发布时间】:2017-04-28 22:22:31
【问题描述】:
在 javascript 中,为什么列表不使用变量更新?
var x = 5;
var l = [x];
x += 6;
为什么l 还是 5 而不是 11?有没有办法让它用变量更新?
【问题讨论】:
标签: javascript
在 javascript 中,为什么列表不使用变量更新?
var x = 5;
var l = [x];
x += 6;
为什么l 还是 5 而不是 11?有没有办法让它用变量更新?
【问题讨论】:
标签: javascript
l 是值列表,而不是指针列表。为了模拟您尝试做的事情,您可以存储可变对象并对其进行变异。
var x = { val: 5 };
var l = [x];
x.val += 6;
console.log(l); // [{ val: 11 }]
【讨论】:
与对象不同,原始值是不可变的。更改它们后,您必须重新分配它们。
var l = [x];
x += 6;
var l = [x]; // new value updation.
由于您不持有对数组的引用,因此分配了一个新数组。
如果你持有对数组的引用,你可以只更新变量而不是整个数组。
var arr = [x];
var l = arr;
x += 6;
arr[0] = x; // new value updation at position 0.
【讨论】:
var l = [x += 6] 也是一种简便的方法。
我的理解是,这其实很简单:
Javascript 总是按值传递,但是当一个变量引用一个对象(包括数组)时,“值”就是对该对象的引用。
更改变量的值永远不会改变底层基元或对象,它只是将变量指向一个新的基元或对象。
但是,更改由变量引用的对象的属性确实会更改底层对象。
更新数组值的唯一方法是重新分配它。
【讨论】:
变量不会自行更新。你必须重新定义它。
var x = 5;
var l = [x];
x += 6; // x has changed but l has not, because you defined it to be old x
l = [x] // redefine it to be new x
console.log(l);
【讨论】:
var x = 5;
x +=6;
var l = [x];
有了这个 var l 将是最新的
【讨论】: