为什么console.log显示不正确的对象值?

5
我不理解为什么在我还没有输入这些数字之前,console.log 显示 d1 包含 [100,200,300]。然而,普通的 for loop 正确地显示了 d1 的内部。请问有人能解释一下 Google Chrome 中 console.log 的这种行为/bug吗? https://jsfiddle.net/ZSvyt/
var container = {};
container["0"] = [10, 20, 30];
var d1 = container;

console.log('before console.log');
console.log(d1); // <--- IT DISPLAYS [100, 200, 300]. WHY?

// before for loop
console.log('before for loop');
for (var i = 0; i < d1["0"].length; i++) {
    console.log(d1["0"][i]);
}

container["0"] = [100, 200, 300];

console.log('after console.log');
console.log(d1);

// after for loop
console.log('after for loop');
for (var i = 0; i < d1["0"].length; i++) {
    console.log(d1["0"][i]);
}

输出:

before console.log
Object {
    0: Array[3]
}
0: Array[3] 
0: 100
1: 200
2: 300 

before for loop
10
20
30

after console.log
Object {
    0: Array[3]
}
0: Array[3] 
0: 100
1: 200
2: 300

after for loop
100
200
300

1
这种情况有时会发生在嵌套的“对象”中,因为控制台的查找可能会在引用已更改之后发生。如果确切性很重要,请使用JSON。 - Paul S.
这个问题把我搞得很惨.. 至少现在我知道了。 - Kareem Kamal
1个回答

9

那是因为控制台中的内容是dt的引用而不是副本。

你可以复制这个对象并将其记录下来(使用这个问题中的代码)。

或者,您可以使用JSON.stringify来记录表示它的字符串。

console.log( JSON.stringify(dt) ); 会将其打印成字符串形式。

此外,如果您正在使用lodash,则可以使用console.log(_.cloneDeep(dt))来克隆并记录该对象中的正确值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接