javascript以错误的顺序执行

javascript以错误的顺序执行,javascript,node.js,google-chrome,ecmascript-6,chromium,Javascript,Node.js,Google Chrome,Ecmascript 6,Chromium,在Chrome控制台中,似乎第2行在第1行之前执行。为什么? function fn(obj){ console.log(obj); obj.a = 1; } fn({b:1}); // prints {a:1, b:1} in console! WHAT!!! fn({}); // prints {}. OMG. WHAT. This is inconsistent with above behaviour! 在边缘控制台中不会发生这种情况。您正在将对象记录到控制台。

在Chrome控制台中,似乎第2行在第1行之前执行。为什么?

function fn(obj){
    console.log(obj);
    obj.a = 1;
}

fn({b:1}); // prints {a:1, b:1} in console! WHAT!!!
fn({});    // prints {}. OMG. WHAT. This is inconsistent with above behaviour!

在边缘控制台中不会发生这种情况。

您正在将对象记录到控制台。您记录的任何内容都是对实际对象的引用。由于更新了对象,因此参照将反映最新的值


要进行测试,您可以在设置对象a的值之前尝试记录它。

这是因为当您检查

{b:1}

该函数已完成

如果您在功能完成前检查obj,您会发现;例如:

控制台上的obj,其行为类似于{…:,…:}

这是一个参考

当您检查它时,它会显示此时obj的快照 {

…:

…:

}

例如:

实际上,这是当时真正的obj

因此,当您有时间检查obj时,功能已经完成。因此,此时您没有机会检查obj,除非:

给你另一个obj看看当时发生了什么。

这似乎是Chrome devtools控制台的一个bug功能。例如,如果您运行此代码段,您将得到

{
  "b": 1
}
但如果同时打开Chrome控制台,您将得到如下结果:

{b: 1}
  a:1
  b:1
如您所见,第一行反映了记录时的
obj
状态,但当您单击它时,它的内容似乎会更新

在记录的对象右侧还有一个蓝色的信息工具提示,上面写着:“下面的值刚刚被评估过”,它确认这是一个功能,而不是一个bug

功能fn(obj){
控制台日志(obj);
目标a=1;
}

fn({b:1})
但是当运行
console.log(obj)
时,
obj
尚未更改?正如我所解释的,它是一个参考。更新实际对象后,console中的引用将显示最新的值。尝试在更新值之前放置一个断点,看看会发生什么。打开空对象,它将显示{a:1}。我在谷歌chrome控制台上试用过。当您通过引用进行复制时,我猜当您再次打开对象时,它会从引用中读取,此时obj.a=1已经执行,因此您会看到后面的值。@Johnley顺便说一句,在我的Chrome中,在记录的对象右侧有一个蓝色的信息工具提示,上面写着:“下面的值刚刚计算过”。所以这肯定是一个特性,而不是一个bug:)
{b: 1}
  a:1
  b:1