未引用的数组在“切片”之后不那么未引用
Unreferenced Array not so Unreferenced after "slice"?
注意:这不是常见数组复制"问题"的数百万个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)
相关文章:
- 引用对象中的通用值
- 如何在JavaScript中将字符串转换为函数引用
- 当包含另一个asp文件时,是否也包含所有引用的样式和脚本页面
- electronic BrowserWindow的最小高度和宽度在hide()show()方法之后不起作用
- 在chrome.tabs.onCreated之后加载HTML页面
- 在Jquery detachment()和appendTo()之后定位元素
- AngularJS:ng之后,重复$scope值未按预期更新
- 在动态创建的元素上获取对特定选择器的引用
- IIFE中的函数引用不可用
- 如何通过引用var Using DataTables来进行分页或排序
- 如何在创建键时引用来自同一对象的键
- Datatables:通过DOM数据源中的名称引用列
- 自引用回调
- 引用类变量中的原型方法
- 无法获取属性'selectedIndex'的未定义引用或null引用
- 为什么元素的宽度在页面加载之后和那一刻之后不同
- 在 JSON.stringify-ing 和 JSON.parse-ing 之后恢复对象引用
- 未引用的数组在“切片”之后不那么未引用
- 我似乎不能引用2模式填充之后
- Jasmine:在具有函数引用的 spyOn 之后调用的真实函数