Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.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对象属性是否按顺序分配?_Javascript - Fatal编程技术网

Javascript对象属性是否按顺序分配?

Javascript对象属性是否按顺序分配?,javascript,Javascript,假设我有一个基于函数返回值分配属性的对象: var i = 0; var f = function() { return ++i; } var foo = { a:f(), b:f(), c:f() }; 是否保证foo.a为1,foo.b为2,foo.c为3?我知道JS不能保证迭代对象时的顺序,那么赋值呢 JS规范中有没有指定它?我只是问教育方面的原因 谢谢。作业总是井然有序的。这就是代码被发现、

假设我有一个基于函数返回值分配属性的对象:

var i = 0;

var f = function() { return ++i; }

var foo = {
            a:f(),
            b:f(),
            c:f()
          };
是否保证foo.a为1,foo.b为2,foo.c为3?我知道JS不能保证迭代对象时的顺序,那么赋值呢

JS规范中有没有指定它?我只是问教育方面的原因


谢谢。

作业总是井然有序的。这就是代码被发现、解释和执行的方式。

是的,你可以保证a是1,b是2,等等。每个
f()
都将按照你编写它们的顺序进行解释。

我没有正式的来源可以引用,但让我们用一点常识

如果作业没有按顺序完成怎么办?您永远无法知道哪个值将被分配给哪个属性,这使得对象结构毫无用处(至少在使用对象文字语法时是如此)

如果它是函数调用、原语文本或其他值,则没有区别。如果不能保证它按顺序发生,它就不会起作用


在ECMAScript 5中从左到右快速搜索术语
,如果有帮助,下面是一些结果:

7词汇约定 ECMAScript程序的源文本首先转换为一系列输入元素,这些元素是标记、行终止符、注释或空白。从左到右扫描源文本,重复使用尽可能长的字符序列作为下一个输入元素

11.8.5抽象关系比较算法 …这是必需的,因为ECMAScript指定表达式从左到右的求值

附录D(资料性附录)第5版中可能对第3版兼容性产生影响的更正和澄清
ECMAScript通常使用从左到右的求值顺序,但是ECMAScript 6 wiki中的>和的第3版规范语言将定义JS的新版本:

当输入范围(块、函数体、程序、模块体等)时,所有直接包含的函数和类声明声明的变量都绑定到各自的函数和类然后所有类主体都按文本顺序执行。在计算类定义时,类主体定义并初始化类范围的属性一次。这包括构造函数(“类”本身)及其原型属性的属性这些初始化按文本顺序进行

你的消息来源到了!JavaScript对象属性在对象上按文本顺序初始化。数组(当前)并不总是遵循此规则

来源

当我在ECMAScript 5中找到引用时,我将编辑这篇文章,尽管我确信它在那里

编辑:找到了 ECMAScript 5确实有它:

如果实现为for in语句定义了特定的枚举顺序,则必须使用相同的枚举顺序对该算法步骤3中的列表元素进行排序

这定义了对
DefineOwnProperty
的调用,从而定义了属性在内部表中的位置。

生产属性名称和值列表:属性名称和值列表, 房地产设计评估如下:

1. Let obj be the result of evaluating PropertyNameAndValueList.
2. Let propId be the result of evaluating PropertyAssignment.
...
5. Call the [[DefineOwnProperty]] internal method of obj with arguments propId.name, propId.descriptor, and false.
6. Return obj.

因此,是的,顺序是由标准强制执行的。

javascript解释器提供源代码总是很好的。在本例中,LTR是关于语句的求值顺序,而不是属性顺序。他们所说的LTR是“a>b”,因为“a大于b”,而不是相反。我已经为ECMAS5和ECMAS6提供了正确的段落。@SébastienRenauld:这是对表达式求值顺序的一般性引用,尽管要点没有改变。如果不能依赖顺序,对象文字语法将毫无用处。@SébastienRenauld:而且您的ECMAScript 5引用与所问问题无关。在中使用
for时,ES实现可以自由定义枚举顺序。根据设计,该定义可能是可靠的,也可能是不可靠的。您引用的是
defineProperties
的定义,它简单地说明,如果定义了枚举顺序,则该顺序将应用于属性的创建。这与对象文字语法完全无关。枚举顺序是从第11节的两个步骤中获得的,这是从JSON文字定义中获得的。我已经提供了一个链接,指向实际秩序得到明确尊重的地方——最后一步——而不是沿途的每一步……如果你仔细想想,这是有道理的。当您使用
.defineProperties()
时,您正在传递一个对象文本来创建属性。对象文本不是目标对象本身。需要枚举此对象文字以获取其信息,以便在目标对象上定义新属性。因此,如果实现定义了枚举顺序,则在内部枚举属性描述符时遵循相同的顺序是有意义的。OP既没有询问ES6类,也没有询问枚举或in for in循环。@Bergi:
Object.defineProperties(O,Properties)
从不用于in循环,ES6类的大部分用途和属性都直接取自ES5对象。