未引用的数组在“切片”之后不那么未引用

Unreferenced Array not so Unreferenced after "slice"?

本文关键字:引用 之后 数组 切片      更新时间:2023-09-26

注意:这不是常见数组复制"问题"的数百万个dup之一,使用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]]

创建了三个数组对象

只有外面的那个被slice。这会导致"浅拷贝"。

考虑一下:

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]

祝您编码愉快!

一切都按预期工作

indexOf按引用而不是值搜索,因此如果两个对象不相互===indexOf将找不到它们

在您的情况下:

var oldArr = [[1,2],[3,4]];
var find = oldArr[1];
var newArr = oldArr.slice(0);

find指向数组 [3,4];所以 newArray 包含 2 个对象(两个数组)。如果你想看看到底发生了什么,试着做 find.push(5)