我正在尝试使用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 StackOverflow问题。

第二个和第三个问题说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属性被打印出来?

最佳答案

// the printed object has a "foo" property.
console.log(num, f(num));


此行为并非特定于console.log。函数开始运行之前(按顺序)评估函数的所有参数。由于f(num)console.log的参数,因此在console.log有机会查看num之前调用它。

本质上,正在发生的是:

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/

10-12 12:27
查看更多