注意:这不是使用 arr.slice(0)
修复此“问题”的常见数组复制“问题”的数百万重复之一
也就是说,我想了解为什么我会得到这个意想不到的结果:
var oldArr = [[1,2],[3,4]];
var find = oldArr[1];
var newArr = oldArr.slice(0);
console.log(newArr.indexOf(find)); //1?
//proof that newArr is NOT referenced to oldArr
newArr[0] = "Hi";
newArr[1] = "How are you?";
console.log(oldArr+" "+newArr); //"1,2,3,4 Hi,How are you?"
如果您将 find
替换为以下任何选项,它将返回预期的 -1
:
- 直接使用
[3,4]
- 使用变量保存
[3,4]
- 使用一个变量引用另一个包含
[3,4]
的数组
我找不到任何关于为什么这最后三种方法与第一个示例之间有任何区别的解释。据我所知,应该没有。
有什么想法吗?
最佳答案
在:
[[1,2],[3,4]]
创建了三个数组对象。
只有外层的被切片
。这会导致“浅拷贝”。
考虑一下:
var a = [1,2]
var b = [3,4]
var c = [a,b]
var d = c.slice(0)
d[0] === a // true, which means it is the /same/ object
d[0][0] = "Hi!"
a // ["Hi!", 2]
编码愉快!
关于javascript - 未引用数组在 "slice"之后不是那么未引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10458356/