声明前登录到Google Chrome控制台的Javascript对象属性

声明前登录到Google Chrome控制台的Javascript对象属性,javascript,google-chrome,Javascript,Google Chrome,我一直在使用谷歌Chrome 28.0.1500.95 m版控制台测试一些JavaScript,希望对其工作原理有更多的了解:看看下面的代码: var obj = { a: 99, f: function() { } } console.log(obj.a) console.log(obj.z) console.log(obj) o.z = 100; 这将输出以下结果: 99 undefined Object {a: 99, f: function} a: 9

我一直在使用
谷歌Chrome 28.0.1500.95 m版
控制台测试一些JavaScript,希望对其工作原理有更多的了解:看看下面的代码:

var obj = {
    a: 99,
    f: function() { }
}

console.log(obj.a)
console.log(obj.z)    
console.log(obj)

o.z = 100;

这将输出以下结果:

99 
undefined 
Object {a: 99, f: function}
a: 99
f: function () { }
z: 100
__proto__: Object
我的问题是,为什么
z
在日志之后才被声明,却在结果中可见

我假设这与控制台的工作方式有关,而不是我不知道的JavaScript中的一些奇怪的范围规则


有人能告诉我这里发生了什么吗?

控制台中的对象最初显示为
object
,单击箭头时展开

展开对象时会出现一个i图标,悬停对象时会看到答案:

在第一次扩展时捕获下面的对象状态


在扩展之后,您看到的是对象在扩展时的状态,而不是调用
log()

Lol时的状态,即使在版本28中,他们所做的唯一改进就是添加了几乎无法发现的工具提示(即:我在这里对数组进行排序),这是否意味着我的脚本逻辑写错了?因为首先显示的顺序与扩展列表中显示的顺序不同。控制台的输出与脚本逻辑无关(例如,您可以记录加入的数组以获得日志中的预期顺序)。顺便说一句,firefox的操作完全相同