Lodash forOwn和forOwnRight迭代顺序

时间:2015-03-18 21:53:12

标签: javascript lodash

在lodash中,您可以找到以下功能:

_.forOwn _.forOwnRight

forOwn函数的示例以a-z顺序迭代属性,但是说:

  

不保证迭代顺序

虽然forOwnRight声称以相反的(z-a)顺序进行迭代。

这对我来说没什么意义,所以有两个问题

  1. 如果迭代订单无法保证,为什么forOwnRight甚至存在?
  2. 为什么不能保证订单?

3 个答案:

答案 0 :(得分:6)

  1. 订单无法保证,但一致。这意味着_.forOwnRight可以保证提供从_.forOwn

  2. 反转的结果
  3. 这是按照规范:它没有说明对象的属性必须如何排序,因此由JS引擎决定如何处理它(并且出于性能原因,它们的表现不同)。

  4. 注意:顺序不仅取决于特定的ES实现,还取决于运行时,因为现代JS VM在运行时会做很多启发式。

    对于那些对优化感兴趣的人来说,这是一个很好的联系(在这个Q / A中,它真的不适合):

答案 1 :(得分:1)

查看来源,我们可以看到:

function baseForOwn(object, iteratee) {
    return baseFor(object, iteratee, keys);
}

function baseForOwnRight(object, iteratee) {
    return baseForRight(object, iteratee, keys);
}

function baseFor(object, iteratee, keysFunc) {
    var index = -1,
        iterable = toObject(object),
        props = keysFunc(object),
        length = props.length;
    while (++index < length) {
        var key = props[index];
        if (iteratee(iterable[key], key, iterable) === false) {
            break;
        }
    }
    return object;
}

function baseForRight(object, iteratee, keysFunc) {
    var iterable = toObject(object),
        props = keysFunc(object),
        length = props.length;
    while (length--) {
        var key = props[length];
        if (iteratee(iterable[key], key, iterable) === false) {
            break;
        }
    }
    return object;
}

这两个函数内部依赖于keysFunc,它返回传递的对象的键。由于对象键的顺序没有严格定义,因此无法预先知道顺序,但是这两种方法在内部使用相同的方法,因此保证颠倒顺序是完全相反的。

答案 2 :(得分:1)

我认为首先回答问题2会更容易。

  1. 函数forOwnforOwnRight都可以使用对象,因此,无法保证属性的顺序,如{{3> 4.3.3对象中所述{{3 }}:
  2.   

    [一个对象]是一个无序的属性集合   包含原始值,对象或函数。

    通常,VM按其插入顺序打印属性,但这不应被视为一般事实。有关详细信息,另请参阅Ecma-262 specification

    1. 虽然假设forOwn按照以下顺序[a, c, b] 处理特定javascript运行时的属性,但您可以保证forOwnRight将处理属性按[b, c, a]的顺序排列。因此,有两种方法都有意义。