【问题标题】:Javascript Array logging confusionJavascript数组日志记录混乱
【发布时间】:2012-03-16 09:12:22
【问题描述】:

我注意到了一些我完全无法理解的东西。我正在用 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,如 here 所述。 问题是实际的控制台输出看起来像:4[1,2,3,4,5]5

见:http://jsfiddle.net/HknMF/

到底是什么让5 出现在第二个日志输出中?

编辑:下面是 Firebug 的屏幕截图,显示了这两种行为:http://i.imgur.com/fwAK3.png

【问题讨论】:

  • 你确定吗?我尝试在 jsfiddle 中运行您的代码,并且控制台输出与预期的一样......我在 Firefox 10.0.2 上。你用的是什么浏览器?
  • @Hery 是的,我确定,我在 Chrome 和 Firefox(使用 Firebug)中尝试过。你使用什么样的控制台?萤火虫也是?
  • @Hery 奇怪的是,我可以让 Firebug 显示这两种行为。 “奇数”一个将显示HknMF/show 作为源,另一个显示_display
  • 确实很奇怪。对我来说, HknMF/show 和 _display 都显示相同的输出。我尝试在 chromium 中运行 jsfiddle 代码,我终于看到了你的输出......
  • @Hery 我加了个截图,很奇怪....

标签: javascript arrays console


【解决方案1】:

某些浏览器中的控制台使用对数组/对象的引用,因此当您检查它并且在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)

可以轻松克隆数组(浅拷贝!)

【讨论】:

  • 好吧,解释了很多,有没有办法记录数组的当前状态?
  • JSON.stringify() 或克隆它 (a.slice(0))
  • ...或console.log(a + ''); console.log(a.join(','));
【解决方案2】:

您的实时数组是否被记录(Chrome)或字符串表示(Firefox)取决于浏览器。

浅拷贝足​​以防止这种情况发生。使用:

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

为此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-05
    • 2014-12-25
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多