以下代码块应该控制台记录数组('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'));
答案 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.
这是我在做的时候得到的,然后展开两个条目:
为确保您看到的是静态副本,您可以这样做:
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));