jQuery.each() - jQuery如何知道参数是索引,键,值还是对象?

时间:2016-01-08 08:09:41

标签: jquery

说出这样的话:

$.each(json_object_or_array, function(arg1, arg2) {

      //do something
});

我见过arg1arg2iindexkeyvalvalue的情况或obj或甚至隐含地引用其中一个的随机名称。例如,我看到function(key, val)也显示为function(name, val)。 jQuery如何知道name这里指的是key

jQuery如何知道我们所指的是什么?

3 个答案:

答案 0 :(得分:3)

不懂英语。您使用的变量名称是完全任意的 - 参数名称仅在函数内相关。索引(或i或键)是第一个参数;值(或obj或val)是第二个。

编辑:如果你问jQuery.each如何知道它是否应该像集合一样迭代,或者好像它是一个对象 - 它会尝试从集合本身检测它。有时它会错过,特别是在旧版本的jQuery中。

var weird = {
  length: 2,
  width: 7,
  breadth: 8
};

$.each(weird, function(k, v) {
  console.log(k, v);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min.js"></script>

在这里,它认为我们正在处理一个数组,因为它有length,因此它开始计算索引。较新的jQuery将正确执行,并显示对象的属性:

var weird = {
  length: 2,
  width: 7,
  breadth: 8
};

$.each(weird, function(k, v) {
  console.log(k, v);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

答案 1 :(得分:2)

$.each通用迭代器函数

如果是Array,那么它将是index value,如果它是object则会key value。基于$.each(object/Array)

您可以根据

检查类型
jQuery.type( new Array() ) === "array" or  


jQuery.type( new Object() ) === "object"

jQuery内部检查type并且基于整个事情的工作。

答案 2 :(得分:1)

虽然已经选择了答案,但我想解释一下我的想法:

以下代码片段来自jQuery库,您可以在内部查看它的功能。您可以看到if条件是否存在检查对象为ArrayObject的情况。

如果传递的元素是类似于对象的数组,则内部创建一个循环,然后使用标准for循环进行迭代:

for(;;){} 

如果对象然后用于....循环:

for(var key in object){}

所以此代码段显示了用法:

// args is for internal usage only
each: function( obj, callback, args ) {
    var value,
        i = 0,
        length = obj.length,
        isArray = isArraylike( obj ); // <---this checks the passed obj is [] || {}

    if ( args ) {
        if ( isArray ) { // <----------------------if [] then use standard for loop
            for ( ; i < length; i++ ) {
                value = callback.apply( obj[ i ], args );

                if ( value === false ) {
                    break;
                }
            }
        } else { // <------------------------------if {} then use for..in loop 
            for ( i in obj ) {
                value = callback.apply( obj[ i ], args );

                if ( value === false ) {
                    break;
                }
            }
        }

    ........
},

这是isArrayLike()方法:

function isArraylike( obj ) {

    // Support: iOS 8.2 (not reproducible in simulator)
    // `in` check used to prevent JIT error (gh-2145)
    // hasOwn isn't used here due to false negatives
    // regarding Nodelist length in IE
    var length = "length" in obj && obj.length,
        type = jQuery.type( obj );

    if ( type === "function" || jQuery.isWindow( obj ) ) {
        return false;
    }

    if ( obj.nodeType === 1 && length ) {
        return true;
    }

    return type === "array" || length === 0 ||
        typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}