我在JavaScript
中碰到了一些完全违背我直觉的东西。我首先定义一个函数Shuffle(Input_array)
,它使数组的顺序随机化。然后我定义一个数组Words
,将其打印到控制台,然后打印Shuffle(Words)
的结果。
这是代码:
<script>
function Shuffle(Input_array) {
var currentIndex = Input_array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = Input_array[currentIndex];
Input_array[currentIndex] = Input_array[randomIndex];
Input_array[randomIndex] = temporaryValue;
}
return Input_array;
}
var Words = [["I","think"],["this","is"],["very","strange"]];
console.log(Words);
console.log(Shuffle(Words));
</script>
运行此脚本时,我的两个调用都会生成相同的输出,即一个混洗数组。但是,在注释掉最后一个console.log
命令时,数组将按照我定义的顺序打印。
这怎么可能?看起来第一个console.log
输出会受到第二个输出的影响。
应该注意的是,如果我以1D方式定义我的数组,例如var Words = ["This", "actually", "works"];
,则不会发生这种情况。我不知道我的函数是否无法处理2D数组,但这根本不重要,因为后来的函数调用不应该影响它之前的操作。
答案 0 :(得分:4)
Javascript控制台包含数组的实时副本,而不是调用console.log()
时内容的快照。 Shuffle()
函数修改了数组。如果在调用Shuffle()
后展开数组的第一个日志的内容,它将显示当前内容,这些内容按随机顺序排列。
1D阵列不会发生这种情况的原因是因为console.log()
会立即显示内容,而不是等待您点击显示三角形。
如果在两个调用之间设置断点,则可以查看数组的原始未抽取内容。或者您可以使用console.log(JSON.stringify(Words))
以文本格式查看快照。
答案 1 :(得分:1)
它正在按预期工作,因为您正在修改输入数组。在Javascript中,所有对象都在内存中有引用,如果您在不事先创建对象的新实例的情况下对其进行修改,则需要更改您的&#34;原始&#34;对象
数组基本上是对象,因此应用相同的原理。
要修复shuffle
方法,您需要创建一个新实例,而不是直接操作输入数组。
function Shuffle(Input_array) {
Input_array = Input_array.slice(); // creates a new instance in memory
var currentIndex = Input_array.length, temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = Input_array[currentIndex];
Input_array[currentIndex] = Input_array[randomIndex];
Input_array[randomIndex] = temporaryValue;
}
return Input_array;
}
var Words = [["I","think"],["this","is"],["very","strange"]];
console.log(Words);
console.log(Shuffle(Words));
console.log(Words !== Shuffle(Words));
&#13;