为啥我不能使用 Underscore 或 lodash 遍历 `performance.timing`?

Posted

技术标签:

【中文标题】为啥我不能使用 Underscore 或 lodash 遍历 `performance.timing`?【英文标题】:Why can't I iterate over `performance.timing` using Underscore or lodash?为什么我不能使用 Underscore 或 lodash 遍历 `performance.timing`? 【发布时间】:2015-05-27 13:03:28 【问题描述】:

为什么会这样:

setTimeout(function()
    var myObj = 
        'hello':'world',
        'more':'things'
    ;
    
    _.each(myObj, function(value, key)
        console.log(key, value);
    );
    
    // why doesn't this output anything?    
    _.each(performance.timing, function(value, key)
        console.log(key, value);
    );
    
    // just to make sure we can
    console.log(performance.timing);
,500);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>

输出这个:

> hello world
> more things
> PerformanceTiming 

我希望对象的键和值得到与myobj 相同的输出。

下划线:http://jsfiddle.net/a43vb7gd/1/ lodash:http://jsfiddle.net/mkxncwax/1/

在 Ubuntu 14.04.2 LTS 上的 Chrome 43.0.2357.81 和 Firefox 38.0 上重现。

【问题讨论】:

在 Chrome 上运行良好 您在哪个浏览器中遇到问题? 刚刚编辑了您的代码以使用 snipplet,我看到了您在 OSX 上使用 chrome 看到的内容 @mshaaban 它在 Ubuntu 14.04 上的 Chrome 和 Firefox 上为我重现。已添加到问题中。 【参考方案1】:

我唯一能想到的就是宿主对象的怪异。 Object.keys(performance.timing) 返回和空数组。如果代码在页面上运行与在控制台中运行,代码的行为也会有所不同。

【讨论】:

【参考方案2】:

因为 performance.timing 只是 PerformanceTiming 类的一个实例。这意味着performance.timing.__proto__ 等于PerformanceTiming.prototype

performance.timing 没有自己的属性,但所有从PerformanceTiming.prototype 继承的属性。您可以通过以下方式获取其所有属性:

Object.keys(PerfomanceTiming.prototype)

Object.keys(performance.timing.__proto__)

【讨论】:

以上是关于为啥我不能使用 Underscore 或 lodash 遍历 `performance.timing`?的主要内容,如果未能解决你的问题,请参考以下文章

使用 underscore.js 从对象/数组中仅检索一个字段

30 underscore

JavaScript underscore

Underscore.js:使用在对象中找到的键从对象列表中创建映射

underscore js:更智能的列表渲染与每个或替代

为啥我不能在其他类或函数中使用我的 Propel ORM 类?