在lodash中,您可以找到以下功能:
forOwn
函数的示例以a-z顺序迭代属性,但是说:
不保证迭代顺序
虽然forOwnRight
声称以相反的(z-a)顺序进行迭代。
这对我来说没什么意义,所以有两个问题
forOwnRight
甚至存在? 答案 0 :(得分:6)
订单无法保证,但一致。这意味着_.forOwnRight
可以保证提供从_.forOwn
这是按照规范:它没有说明对象的属性必须如何排序,因此由JS引擎决定如何处理它(并且出于性能原因,它们的表现不同)。
注意:顺序不仅取决于特定的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会更容易。
forOwn
和forOwnRight
都可以使用对象,因此,无法保证属性的顺序,如{{3> 4.3.3对象中所述{{3 }}:[一个对象]是一个无序的属性集合 包含原始值,对象或函数。
通常,VM按其插入顺序打印属性,但这不应被视为一般事实。有关详细信息,另请参阅Ecma-262 specification。
forOwn
按照以下顺序[a, c, b]
处理特定javascript运行时的属性,但您可以保证forOwnRight
将处理属性按[b, c, a]
的顺序排列。因此,有两种方法都有意义。