我正在尝试使用 JavaScript,最终得到了这个片段:
var num = new Number(20);
function f(n) {
n["foo"] = "bar";
}
// the printed object has a "foo" property.
console.log(num, f(num));
我从没想过打印的对象会有 foo
属性添加到 f(num)
打电话,因为f(num)
在 num
之后在我的console.log
(我正在使用 Chrome)。
但这件事发生了,我立即想到的是 console.log
有点运行所有参数并打印出结果之类的,所以我转到 MDN 的文档 console.log
,但没有任何事情。
然后我偶然发现了this堆栈溢出问题。
第二个问题和第三个问题说 console.log
与对象一起使用时有点晚,但在这种情况下,以下代码片段中打印的对象应该有 foo
属性也是如此(因为它是一个 Number
对象),但它不是:
var num = new Number(20);
function f(n) {
n["foo"] = "bar";
}
// no "foo" property
console.log(num);
f(num);
我提到的问题的可接受答案几乎说明了第二个和第三个答案所说的内容,除了它还指出该行为取决于控制台或浏览器。那么,现在不同的浏览器如何处理这种事情(这个问题是 6 年前的问题)?是console.log
仅对于非常大的对象异步?原来的问题是,为什么num
在我的第一个示例中,打印出 foo
属性(property)?
最佳答案
// the printed object has a "foo" property.
console.log(num, f(num));
此行为并非特定于 console.log
。在函数开始运行之前,函数的所有参数都会(按顺序)求值。由于 f(num)
是 console.log
的参数,因此在 console.log
有机会查看 之前调用它编号
.
本质上,发生的事情是:
var arg1 = num;
var arg2 = f(num); // modifies num in place, so arg1 changes as well
console.log(arg1, arg2);
关于javascript - 在流行的浏览器中, "console.log"关于执行延迟的最新行为是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47062892/