javascript - 未引用数组在 "slice"之后不是那么未引用?

标签 javascript arrays pass-by-reference

注意:这不是使用 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?"

jsFildde Demo

如果您将 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/

相关文章:

c - 如何增加这个字符串的基地址?

c# - 将一维编码的二维数组划分为多个扇区

.net - 通过引用传递数组元素

c++ - 'const&' 在 C++ 中是什么意思?

javascript - 函数返回未定义、预期的 Promise 或值异步方法

c - 为什么两个不同函数的数组和指针参数的地址相同?

javascript - 在 HTML 中集成 Javascript 和 Jquery

go - 通过引用分配

javascript - 没有唯一标识符的 Bootstrap 崩溃

php - 在javascripts中嵌入php