JQuery和Underscore"每个"保证数组的顺序?

dgn*_*nin 12 javascript each jquery underscore.js

我读了Javascript:好的部分......

由于JavaScript的数组实际上是对象,因此该for in语句可用于迭代数组的所有属性.不幸的是,因为不能保证房产的顺序......

据我所知,"每个"函数都是基于的for in,那么each函数形式JQuery和Underscore库在迭代数组时保证顺序吗?我试图避免令人讨厌的标准for.

先感谢您.

Jos*_*eph 17

迭代数组时,始终保证顺序.当你无法保证迭代(非数组)对象时.顺便说一下,数组仍然是对象.


each只不过是for in对象和for类似数组.框架确定作业的正确循环,并应用相同的逻辑:数组迭代是有序的,而对象迭代则不是.

Underscore的来源:

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 (_.has(obj, key)) {
                    if (iterator.call(context, obj[key], key, obj) === breaker) return;
                }
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

jQuery的来源:

each: function (object, callback, args) {
    var name, i = 0,
        length = object.length,
        isObj = length === undefined || jQuery.isFunction(object);
    if (args) {
        if (isObj) {
            for (name in object) {
                if (callback.apply(object[name], args) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.apply(object[i++], args) === false) {
                    break;
                }
            }
        }
        // A special, fast, case for the most common use of each
    } else {
        if (isObj) {
            for (name in object) {
                if (callback.call(object[name], name, object[name]) === false) {
                    break;
                }
            }
        } else {
            for (; i < length;) {
                if (callback.call(object[i], i, object[i++]) === false) {
                    break;
                }
            }
        }
    }
    return object;
}
Run Code Online (Sandbox Code Playgroud)