我将从代码开始:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
Run Code Online (Sandbox Code Playgroud)
简单吧?对此,Firebug说:
["hi"]
["bye"]
Run Code Online (Sandbox Code Playgroud)
很棒,但Chrome的JavaScript控制台(7.0.517.41 beta)说:
["bye"]
["bye"]
Run Code Online (Sandbox Code Playgroud)
我做错了什么,或者Chrome的JavaScript控制台在评估我的阵列方面特别懒惰?
考虑这个javascript:
var foo = {bar : 1111};
console.log(foo);
console.log(foo.bar);
foo.bar = 2222;
console.log(foo);
console.log(foo.bar);
Run Code Online (Sandbox Code Playgroud)
在Firefox的firebug中,这显示了我的预期:
Object { bar=1111}
1111
Object { bar=2222}
2222
Run Code Online (Sandbox Code Playgroud)
但是,在Safari和Chrome的控制台中,它显示:
Object { bar=2222}
1111
Object { bar=2222}
2222
Run Code Online (Sandbox Code Playgroud)
换句话说,对象在打印转储时在控制台中显示错误的属性,但是如果打印特定属性则显示正确的值.
这是浏览器的怪癖吗?或者我缺少面向对象的javascript的一个基本方面?
打开Chrome开发者工具并输入:
var a = [];console.log(a);a.push(1);console.log(a);
你会期望这会输出类似的东西
[]
[1]
Run Code Online (Sandbox Code Playgroud)
但相反,它输出
[1]
[1]
Run Code Online (Sandbox Code Playgroud)
行为是相同的
var a = [];console.log(a);a[0] = 1;console.log(a);
谁能解释这种行为?
在OS X上运行Chrome.在32位Windows 7上运行相同的行为.
编辑:无论语句是否在同一行,行为都是相同的.我只是将它们放在一行上,以便于测试.
把
var a = [];
console.log(a);
a.push(1);
console.log(a);
Run Code Online (Sandbox Code Playgroud)
在一个文件然后运行它会产生相同的行为.
编辑x 2如果您不想制作要测试的文件, 请参阅:http://jsfiddle.net/9N4A6/.