javascript - js中三元等于比较和数组长度

标签 javascript underscore.js

最后我浏览了一下Underscore.js代码来学习 JavaScript 习惯用法,我发现了以下 each 函数的定义:

var each = _.each = _.forEach = function(obj, iterator, context) {
    if (obj == null) return;
    if (nativeForEach && obj.forEach === nativeForEach) {
        obj.forEach(iterator, context);
    } else if (obj.length === +obj.length) {
        for (var i = 0, l = obj.length; i < l; i++) {
            if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return;
        }
    } else {
        for (var key in obj) {
            if (hasOwnProperty.call(obj, key)) {
                if (iterator.call(context, obj[key], key, obj) === breaker) return;
            }
        }
    }
};

这条线是做什么用的? (我认为这是检查传递的对象是否是数组的一种方法,对吗?如果是这样,typeof 运算符不是更好的方法吗?)

obj.length === +obj.length

最佳答案

each 方法接受集合(数组或对象)。

在检查 native 方法 forEach 是否可用后,该方法检查 obj 是否为数组。使用 typeof 是不可能的,因为 typeof 对于数组和对象都会返回 "object" (尝试 typeof [] === typeof {})。因此,他们使用了 obj.length === +obj.length 方法。

这是有效的,因为如果 obj 没有 length 属性,+obj.length 返回 NaN并且严格比较失败。然后,该方法假设 obj 是一个 object

关于javascript - js中三元等于比较和数组长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7723500/

相关文章:

javascript - 根据属性在Openlayers中搜索wms图层,如果找到就放大

javascript - 异常 : Permission denied to access property "apply" on cross-origin object

javascript - 为什么我应该使用下划线的 isUndefined(x) 而不是 x === undefined?

javascript - 如果键与 underscore.js 匹配,则比较两个数组

javascript - Google Maps API v3 多边形关闭

javascript - 使用 ng-class 时,setTimeout 在表单更改之前不会执行

javascript - Django 使用plotly 和表单中的数据绘制图表

javascript - "this.collection.each is not a function"。每个应该 't it simply say "”吗?

javascript - 使用下划线替换另一个对象的对象键

javascript - 在javascript中将一个对象拆分为多个对象并将它们推送到数组中(可能使用下划线/lodash)