我有一个数组说
var list = ["first", "second"];
现在我将列表分配给其他变量说
var temp = list;
现在我在列表上使用拼接,如
list.splice(0,1);
现在,当我检查列表的值时,它会显示
list = ["second"]
当我检查temp的值时,它会显示
temp = ["second"]
我想知道为什么会这样?为什么 temp 的值会发生变化?
答案 0 :(得分:5)
当您执行var temp = list
之类的作业时,您正在为temp
创建引用list
。因此,splice
就地更改了list
数组,您也在改变temp
使用slice而不是返回数组的副本,如此
var temp = list.slice();
答案 1 :(得分:1)
JS中常见的错误
这是一个指针,而不是对象的克隆:
var temp = list;
如果您想要实际复制对象,有几种方法。最简单的只是将其与自身联系起来:
var temp = list.concat([]);
// or
var temp = list.slice();
请注意,这有点危险,它只从数组中获取基值。有更多高级方法可用于克隆对象和创建“完美”数组克隆。
答案 2 :(得分:1)
答案 3 :(得分:0)
您可以使用原型方法添加此功能。
Object.prototype.clone = function() {
var newObj = (this instanceof Array) ? [] : {};
for (i in this) {
if (i == 'clone') continue;
if (this[i] && typeof this[i] == "object") {
newObj[i] = this[i].clone();
} else newObj[i] = this[i]
} return newObj;
};
然后允许您这样做:
var a = [1,2,3];
var b = a.clone();
a[1] = 5;
console.log(a); //1,5,3
console.log(b); //1,2,3
免责声明:从这里无耻地借用(整篇文章值得一读):http://my.opera.com/GreyWyvern/blog/show.dml/1725165