说出这样的话:
$.each(json_object_or_array, function(arg1, arg2) {
//do something
});
我见过arg1
,arg2
为i
或index
或key
或val
或value
的情况或obj
或甚至隐含地引用其中一个的随机名称。例如,我看到function(key, val)
也显示为function(name, val)
。 jQuery如何知道name
这里指的是key
?
jQuery如何知道我们所指的是什么?
答案 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条件是否存在检查对象为Array
或Object
的情况。
如果传递的元素是类似于对象的数组,则内部创建一个循环,然后使用标准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;
}