Javascript数组日志记录混乱

Javascript Array logging confusion

本文关键字:混乱 记录 日志 数组 Javascript      更新时间:2023-09-26

我注意到一些我根本无法理解的东西。我正在用JavaScript做一些非常简单的事情:

var a = [1,2,3];
console.log(a.push(4));
console.log(a);
console.log(a.push(5));

我希望控制台记录:例如,4[1,2,3,4]5,如此处所述。问题是实际控制台输出看起来像:4[1,2,3,4,5]5

请参阅:http://jsfiddle.net/HknMF/

究竟是什么使5出现在第二个日志输出中?

EDIT:fwiw以下是Firebug的屏幕截图,显示了这两种行为:https://i.stack.imgur.com/x2XH8.png

某些浏览器中的控制台使用对数组/对象的引用,因此当您检查它和console.log()调用后更改的对象时,您将看到更改的对象。

在Firefox中,对象也会发生这种情况,但无论如何都以内联方式显示的数组不会发生这种情况:

>>> var a = [1,2,3]; console.log(a.push(4)); console.log(a); console.log(a.push(5));
4
[1, 2, 3, 4]
5

特别是对于不包含函数的对象,一个快速的解决方法是克隆它们(如果您有jQuery,则记录$.extend({}, yourObject))或记录它们的JSON字符串版本(然后您将失去漂亮的对象视图,只得到一个普通的字符串)。使用a.slice(0) 可以轻松克隆阵列(浅拷贝!)

依赖于浏览器,您的实时数组会被记录(Chrome)或字符串表示(Firefox)。

一份肤浅的副本就足以防止这种情况的发生。用途:

console.log( a.slice(0) );

为此。