JavaScript变量毫无理由地链接在一起
JavaScript variables linked together for no good reason
我正在处理一个项目,其中一个数组变量突然包含与另一个相同的变量。在懒人的警报提示的帮助下,我将问题缩小到了这段代码中,所有的东西都突然出了问题:
// The array "data" is the result of a JSON request - this works fine..
// "data" is a two-dimensional array.
allShowsVars = data.slice();
allShowsVars.sort(function(a, b) {
var aL = a[1].toLowerCase(), bL = b[1].toLowerCase();
if(aL < bL) return -1;
else if(aL > bL) return 1;
else return 0;
});
// At this moment, the allShowsVars variable holds the right contents from the data array..
showsVars = allShowsVars.slice(); // Here, we make a copy of allShowsVars..
for(var iS = 0, sPos; typeof showsVars[iS] != 'undefined'; iS++) {
sPos = showsVars[iS][1].indexOf(" - Season ");
if(sPos != -1) {
showsVars[iS][1] = showsVars[iS][1].slice(0,sPos);
if(iS > 0) {
if(showsVars[(iS-1)][1] == showsVars[iS][1]) showsVars.splice(iS,1);
iS--;
}
}
}
// I changed showsVars in the above for loop, cutting out " - Season ......" in a lot of entries.
现在,allShowsVars也有了showsVars的新内容。为什么?变量没有链接在一起!我想我错过了一些显而易见的东西。我只需要一个足够聪明的人来看到它:)
这来自MDN的Array.prototype.slice()的文档。
对于对象引用(而不是实际对象),
slice
将对象引用复制到新数组中。原始数组和新数组都引用同一个对象。如果引用的对象发生更改,则这些更改对新阵列和原始阵列都可见。
这就是你的情况。
你可以使用这个破解来深度复制数组:
var deepCopy = JSON.parse(JSON.stringify(sourceArray));
有关JavaScript数组/对象的深度复制,请参阅此处和此处。
slice()
只执行浅拷贝。基元值是直接复制的,但嵌套对象在内部被视为引用,因此两个数组最终都指向相同的对象。
相关文章:
- JavaScript链接在点击时不起作用;函数在页面加载时工作
- 在 JavaScript 中使用侦听器将输入字段链接在一起
- 我想通过单击按钮将 2 个 php 文件链接在一起
- 如何将(CSS/HTML)的包链接在一起.CSS/HTML->CSS/HTML->CSS/HTML
- 我可以将javascript和方法中的属性链接在一起吗?
- 未定义“角度”(脚本未链接在一起)
- 使用一行将标记链接在一起:googlemapsapi
- 将承诺与多个参数链接在一起
- 如何在react中将单独文件中的组件链接在一起
- JavaScript变量毫无理由地链接在一起
- 如何将CSS、javascript和HTML文件链接在一起
- 如何使用jquery将两个元素关联/链接在一起
- 将大量(>40,000)原生承诺链接在一起会消耗太多内存
- 如何将这些函数与承诺链接在一起
- javascript数组中的对象神秘地链接在一起
- jQuery-如何将DOM元素和Javascript对象链接在一起
- AngularJS-将两个指令绑定/链接在一起
- 使用Jquery(甚至只是Javascript),了解如何将命令链接在一起
- 拥有多个日期选择器并将它们全部链接在一起
- 将多个Select2链接在一起