7

Jquery.each() 和 Array.prototype.forEach() 方法之间是否有任何区别,因为 array.forEach() 方法也可以用于循环具有长度属性的类数组对象。我看到的唯一区别是参数的放置,他们还有什么不同?

 I found this:
 var obj = { one:1, two:2, three:3, four:4, five:5 };

jQuery.each(obj, function(i, val) {
  $("#" + i).append(document.createTextNode(" - " + val));
});

我想知道的是,jquery.each() 是否为没有长度属性的对象调用函数?

4

2 回答 2

17
  • 在回调中放置参数。

  • 回调中的参数数量(.forEach()给你一个对原始集合的引用。)

  • 回调中的默认this值。(在 jQuery 中它是当前项目,在.forEach()它是 JavaScript 默认值)

  • 能够this在回调中手动设置值。(jQuery 没有提供这个选项,.forEach()让你通过第三个参数。)

  • 避免稀疏数组上的未定义属性。(.forEach()避免它们,jQuery 包括它们。)


它们是非常不同的行为方法。jQuery's 没有做任何尝试来符合或补充标准行为。

于 2013-07-05T13:25:52.897 回答
5

除了疯狂火车的回答:

我想知道的是,jquery.each() 是否为没有长度属性的对象调用函数?

阅读来源:

// args is for internal usage only
each: function( object, callback, args ) {
  var name, i = 0,
      length = object.length,
      isObj = length === undefined || jQuery.isFunction( object );

  if ( args ) {
    ...

  // A special, fast, case for the most common use of each
  } else {

    if ( isObj ) {
      for ( name in object ) {
      }
      ...
    }
  }
  return object;
},

因此,您可以查看是否没有 length 属性,或者它的值是undefined,然后 jQuery 认为它是一个普通对象,并将在可枚举属性上执行 for..in 循环,而无需防范继承的属性。

于 2013-07-05T13:55:48.477 回答