gpt4 book ai didi

javascript - for..in 循环是否跟踪对象的属性顺序?

转载 作者:行者123 更新时间:2023-11-30 10:03:55 26 4
gpt4 key购买 nike

我是一般编程的初学者,JavaScript 是我的第一语言。我在读书的时候遇到过这样的顾虑,不知道自己的顾虑是否合适。

我认为 for..in 循环在我们遍历对象时不会跟踪顺序,因为与数组不同,对象的属性不是基于索引的。

这让我质疑我从 Underscore.js 重新创建一些方法的工作,例如 _.each_.reduce

下面是我尝试重新创建这些方法。

var each = function(list, iteratee) {
if (Array.isArray(list)) {
for (var i = 0; i < list.length; i++) {
iteratee(list[i], i, list);
}
} else if (list.constructor === Object) {
for (var key in list) {
iteratee(list[key], key, list);
}
}
};

var reduce = function(list, iteratee, memo){
var memoUndefined = arguments.length < 3;
each(list, function(elem, index, list){
if (memoUndefined) {
memoUndefined = false;
memo = elem;
} else {
memo = iteratee(memo, elem, index, list);
}
});
return memo;
};

它们似乎可以正常工作,因此可以在 Array 和 Object 作为其 list 提供或不提供 memo 的情况下工作。

但是,令我感到疑惑的是,我的 each 函数如何跟踪它正在迭代的属性的顺序?它如何确保被循环的属性的顺序始终一致?它对数组有意义,因为它的属性是索引。但对象不是。我相信这在像我上面的 reduce 这样的函数中实现时可能会有潜在的问题。如果 iteratee 将来做的只是简单的加法或减法,那可能没问题,但乘法或除法呢? each 将迭代的值的顺序将是至关重要的。我的担心合适吗?

最佳答案

ECMAScript ES5 规范明确指出,for/in 循环不保证属性的顺序。来自 section 12.6.4在 ES5 规范中:

The mechanics and order of enumerating the properties (step 6.a in the first algorithm, step 7.a in the second) is not specified.

不过,在大多数 ES5 浏览器实现中,属性是按照它们创建的顺序迭代的。

我读到有人建议将 for/in 的属性顺序记录为新兴 ES6 规范中创建的顺序。

我在ES6草案中没有找到这个具体的措辞,但是关于Object.keys()有这个说明:

If an implementation defines a specific order of enumeration for the for-in statement, the same order must be used for the elements of the array returned in step 4.

请记住,即使顺序始终是特定方式,也没有修改顺序的功能。因此,如果您真的关心属性的顺序,那么对象上的 for/in 循环可能并不是存储/访问有序属性集的真正正确方法。

关于javascript - for..in 循环是否跟踪对象的属性顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30283739/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com