Javascript while循环奇怪的行为

时间:2015-02-04 15:46:32

标签: javascript while-loop

以下代码块应该控制台记录数组('abc'),然后输入while循环一次。在while循环中,第一个索引处的值应该从“a”更改为“z”。 最后,将返回该数组。

然而,看起来甚至在进入循环之前数组也被更改为console.log(arr)产生[“z”,“b”,“c”]而不是[“a”,“b”,“ C“]。

function test(str){
   var arr = str.split('');
   var repeat = true;
   console.log(arr);
   while(repeat){
     repeat = false;
     arr[0] = 'z';
   }
   return arr;
}
console.log(test('abc'));

2 个答案:

答案 0 :(得分:3)

某些控制台实施(特别是Chrome)会向您显示您记录的对象的半实时版本,而不是它的时间点副本。然后它会被冻结,具体取决于你在控制台中使用它做什么(在其他时候也是如此;我从来没有完全理解规则,它们因实现而异。)

在Chrome上复制您所看到的内容的示例 - 使用控制台关闭运行它,然后打开控制台查看结果:

function test(str){
  var arr = str.split('');
  var repeat = true;
  console.log(arr);
  while(repeat){
    repeat = false;
    arr[0] = 'z';
  }
  return arr;
}
console.log(test('abc'));
Run this with the console <strong>closed</strong>, then open it and look at the result.

这是我在做的时候得到的,然后展开两个条目:

enter image description here

为确保您看到的是静态副本,您可以这样做:

console.log(arr.join(", "));

...记录包含数组条目的字符串,而不是数组对象。或者您可以使用JSON.stringify而不是join。或者,对于(并且您的里程可能会有所不同),当我运行上面的第一个代码段时,让控制台打开实际上会显示我的数组的静态副本(是的,真的)

示例:

function test(str){
  var arr = str.split('');
  var repeat = true;
  console.log(arr.join(", "));
  while(repeat){
    repeat = false;
    arr[0] = 'z';
  }
  return arr;
}
console.log(test('abc').join(", "));

或制作数组的副本并记录副本:

示例:

function test(str){
  var arr = str.split('');
  var repeat = true;
  console.log(arr.slice(0));
  while(repeat){
    repeat = false;
    arr[0] = 'z';
  }
  return arr;
}
console.log(test('abc').slice(0));

...但当然,如果数组中有对象,则两个数组都将引用同一个对象,因此您仍然可能存在动态问题。

答案 1 :(得分:0)

正如其他人在chrome console.log中所说的那样,函数异步工作,所以有时候使用console.log后对变量的更改会反映在日志中。我总是使用

打印对象

console.log(JSON.stringify(arr));

将在打印时保持数组或对象的结构。

或复制数组    console.log(arr.slice(0));