如果控制台已关闭,则类似数组的对象和数组不会像数组一样记录

时间:2014-02-27 14:33:40

标签: javascript google-chrome

请参阅this jsbin其中,为了回答另一个问题,我构建了一个类似数组的对象:

function myCollection() {
  var items = [], r = {}
  function myPush(value){
      value += 'bar'
      r[items.length]=value;
      items.push(value)    
  }
  Object.defineProperty(r, "splice", {value:[].splice});
  Object.defineProperty(r, "slice", {value:[].slice});
  Object.defineProperty(r, "length", {
    get : function(){ return items.length}
  });
  Object.defineProperty(r, "myPush", {value:myPush});
  return r;
}

var fooCollection = myCollection();
fooCollection.myPush('foo');
console.log(fooCollection); // logs ["foobar"] 
fooCollection.myPush('Ba');
console.log(fooCollection); // logs ["foobar", "Babar"] 

fooCollection.myPush('wzouing');
console.log(fooCollection.slice(-2)); //logs ["Babar", "wzouingbar"] 
console.log(fooCollection[1]); // logs Babar 

如果您在控制台打开的情况下点击Chromium上的使用JS运行按钮,则可以获得此信息:

enter image description here

非常奇怪的是,如果你在控制台关闭时按下按钮就可以得到这个(当然你在重新打开控制台后看到它):

enter image description here

这是一个已知的错误吗?一项功能 ?灰色地带?有解决方法吗?

*注意:有时候,在Chrome / linux(而不是Chromium)上,我得到的东西更奇怪:关闭并重新打开控制台时,现有日志会发生变化。它们可以从阵列形式转变为折叠形式。 *

3 个答案:

答案 0 :(得分:2)

我认为这种行为可能是一种节省内存/性能的行为,因为解析/打印运行时对象是一项非常昂贵的任务。

如果你真的需要一个未包装的信息,我建议使用

console.dir( myStuff );

或者,对于数组,有一个新的

console.table( myArray );

提示:console.dir也是在Internet Explorer中记录对象内容的方式,而不是log()的默认[object Object]输出。

答案 1 :(得分:0)

这更像是一个问题:https://bugs.webkit.org/show_bug.cgi?id=35801

似乎已经在webkit中修复了。

答案 2 :(得分:0)

  

非常奇怪的是,如果在控制台关闭时记录对象,则无法获得扩展(类似阵列)视图(当然,在重新打开控制台之后)。

     

这是一个已知的错误吗?功能?

一个功能,我猜。控制台在未打开时针对性能进行了优化,因此无法计算对象的扩展视图

  

有解决方法吗?

看看How can I change the default behavior of console.log? (*Error console in safari, no add-on*)。无论如何,您还拥有typical lazyness problem。记录JSON字符串应该有所帮助。