函数调用如何影响先前的操作?

时间:2018-03-05 20:19:03

标签: javascript

我在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数组,但这根本不重要,因为后来的函数调用不应该影响它之前的操作。

2 个答案:

答案 0 :(得分:4)

Javascript控制台包含数组的实时副本,而不是调用console.log()时内容的快照。 Shuffle()函数修改了数组。如果在调用Shuffle()后展开数组的第一个日志的内容,它将显示当前内容,这些内容按随机顺序排列。

1D阵列不会发生这种情况的原因是因为console.log()会立即显示内容,而不是等待您点击显示三角形。

如果在两个调用之间设置断点,则可以查看数组的原始未抽取内容。或者您可以使用console.log(JSON.stringify(Words))以文本格式查看快照。

答案 1 :(得分:1)

它正在按预期工作,因为您正在修改输入数组。在Javascript中,所有对象都在内存中有引用,如果您在不事先创建对象的新实例的情况下对其进行修改,则需要更改您的&#34;原始&#34;对象

数组基本上是对象,因此应用相同的原理。

要修复shuffle方法,您需要创建一个新实例,而不是直接操作输入数组。

&#13;
&#13;
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;
&#13;
&#13;