Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript for..in循环是否跟踪对象的属性顺序?_Javascript_Arrays_Object_Functional Programming_Reduce - Fatal编程技术网

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

Javascript for..in循环是否跟踪对象的属性顺序?,javascript,arrays,object,functional-programming,reduce,Javascript,Arrays,Object,Functional Programming,Reduce,一般来说,我是编程初学者,JavaScript是我的第一语言。在我学习期间,我面临着这种担忧,我不确定我的担忧是否恰当 我认为..在循环对象时,in-loop不会跟踪顺序,因为与数组不同,对象的属性不是基于索引的 这让我怀疑我在从underline.js重新创建一些方法方面的工作,比如u.each和u.reduce 下面是我尝试重新创建这些方法的过程 var each = function(list, iteratee) { if (Array.isArray(list)) {

一般来说,我是编程初学者,JavaScript是我的第一语言。在我学习期间,我面临着这种担忧,我不确定我的担忧是否恰当

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

这让我怀疑我在从underline.js重新创建一些方法方面的工作,比如u.each和u.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;
};
它们似乎工作正常,无论是否提供备忘录,都可以在数组和对象上作为其列表工作


然而,让我好奇的是,我的每个函数如何跟踪它所迭代的属性的顺序?它如何确保循环属性的顺序始终一致?这对于数组是有意义的,因为它的属性是索引。但对象的不是。我相信当在上面的reduce这样的函数中实现时,这可能会有一个潜在的问题。如果iteratee将来所做的只是简单的加法或减法,那可能没问题,但是乘法或除法呢?每次迭代的值顺序至关重要。我的担心是否恰当?

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

枚举属性的机制和顺序 第一种算法,第二种算法中的步骤7.a未指定

尽管如此,在ES5的大多数浏览器实现中,属性是按创建顺序迭代的

我已经了解到,有人建议将for/in的属性顺序记录为新兴ES6规范中创建的顺序

我在ES6草案中没有找到这种特定的措辞,但是有一个关于Object.keys的注释:

如果实现为 对于in语句,必须对的元素使用相同的顺序 数组在步骤4中返回


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

ECMAScript ES5规范特别指出,对于for/in循环,属性的顺序是不保证的。来自ES5规范中的:

枚举属性的机制和顺序 第一种算法,第二种算法中的步骤7.a未指定

尽管如此,在ES5的大多数浏览器实现中,属性是按创建顺序迭代的

我已经了解到,有人建议将for/in的属性顺序记录为新兴ES6规范中创建的顺序

我在ES6草案中没有找到这种特定的措辞,但是有一个关于Object.keys的注释:

如果实现为 对于in语句,必须对的元素使用相同的顺序 数组在步骤4中返回


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

谢谢您的解释。现在我想知道像underline.js或lodash.js这样的流行库是如何实现它们的收集方法来容纳对象的。他们会将其转换为类似数组的对象吗?@KyleC-可以迭代对象的属性,而不知道项目的顺序。例如,jQuery.each就是这样做的。我不太理解你在这方面对下划线或lodash的评论。仅供参考,可以查看下划线和lodash的源代码。为什么不去看看它们是怎么做的呢?我在下划线和lodash中查看了reduce方法的源代码,但它们涉及到一些外来方法,比如optimizedCb。我只是不能理解他们的代码,因为我是一个非常初学者。遵循这样的代码的方法是使用库的非最小化版本创建一个简单的测试页,然后在调试器中逐行遍历代码。这将让你确切地看到它在做什么。如果您还没有学会如何使用调试器,那么这是一件非常值得做的事情,而且不会花那么长时间,特别是如果您使用过其他调试器的话。@KyleC-Chrome内置的调试器非常好,我就是使用它的。还有一些像Firefox的插件Firebug。谢谢你的解释。现在我想知道像underline.js或lodash.js这样的流行库是如何实现它们的收集方法来容纳对象的。他们会把它变成像obj一样的数组吗
ect?@KyleC-可以在不知道项目的顺序的情况下迭代对象的属性。例如,jQuery.each就是这样做的。我不太理解你在这方面对下划线或lodash的评论。仅供参考,可以查看下划线和lodash的源代码。为什么不去看看它们是怎么做的呢?我在下划线和lodash中查看了reduce方法的源代码,但它们涉及到一些外来方法,比如optimizedCb。我只是不能理解他们的代码,因为我是一个非常初学者。遵循这样的代码的方法是使用库的非最小化版本创建一个简单的测试页,然后在调试器中逐行遍历代码。这将让你确切地看到它在做什么。如果您还没有学会如何使用调试器,那么这是一件非常值得做的事情,而且不会花那么长时间,特别是如果您使用过其他调试器的话。@KyleC-Chrome内置的调试器非常好,我就是使用它的。还有一些像Firefox的插件Firebug。