我正在尝试保存数组的副本,然后才对其进行排序:
words_Array = ["Why", "doesnt", "this", "work?"];
var sortedWords_Array = words_Array;
sortedWords_Array.sort(function(a, b){
return b.length - a.length;
});
alert("sortedWords_Array is :"+sortedWords_Array);
alert("words_Array is :"+words_Array);
在对sortedWords_Array进行排序之后,它们都因某种原因而被排序。 http://jsfiddle.net/zv39J/为什么?
答案 0 :(得分:10)
因为在javascript中,数组是通过引用传递的,这意味着当你使一个数组等于另一个时,只要你对一个数组进行编辑,它就会改变。要在您的示例中修复此问题,请更改以下行:
var sortedWords_Array = words_Array;
为:
//make a copy of array by using slice
var sortedWords_Array = words_Array.slice(0);
请参阅此处了解其他用途和更深入的解释:
slice不会改变原始数组,但会返回一个新的“一级” 深度“复制,包含从中切出的元素的副本 原始阵列。
答案 1 :(得分:2)
使用slice
功能快速复制。
另一方面 - 警报很糟糕。没有人想点击一个jsfiddle只是受到一系列警报窗口的欢迎。我已经更新了小提琴以包含jQuery,它允许我们使用一个很好的简洁语法来更新HTML。
答案 2 :(得分:2)
这不会起作用,因为当你尝试分配时
var sortedWords_Array = words_Array;
words_array的引用传递给sortedWords_Array。因此,对sortedWords_Array所做的任何更改都将反映在words_array上。
由于Array.slice()不进行深度复制,因此不适合多维数组:
var a =[[1], [2], [3]];
var b = a.slice();
b.shift().shift();
// a is now [[], [2], [3]]
请注意,虽然我上面使用了 shift()。shift(),但只是b[0][0]
包含指向a[0][0]
的指针而不是值。
同样delete(b[0][0])
也会导致a[0][0]
被删除,b[0][0]=99
也会更改a[0][0] to 99.
jQuery's extend
方法会执行深层复制:
var a =[[1], [2], [3]];
var b = $.extend(true, [], a);
b.shift().shift();
// a is still [[1], [2], [3]]
答案 3 :(得分:1)
对数组执行slice()
复制,然后排序。
var sortedWords_Array = words_Array.slice();