三等于js中的比较和数组长度

时间:2011-10-11 08:51:35

标签: 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

3 个答案:

答案 0 :(得分:0)

+ obj.length将返回一个数值。 ===比较对象的类型及其值。换句话说,它执行严格的比较。

http://geekswithblogs.net/brians/archive/2010/07/03/quality-equality-with-javascript-quotquot-gt-quotquot.aspx

答案 1 :(得分:0)

这一行:

else if (obj.length === +obj.length) {

是必要的,因为

typeof []

将返回

object

答案 2 :(得分:0)

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

在检查本机方法forEach是否可用后,该方法检查obj是否为数组。使用typeof无法做到这一点,因为typeof将为数组和对象返回"object"(try typeof [] === typeof {})。因此,他们使用了obj.length === +obj.length方法。

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