JavaScript ES6是否为对象属性引入了定义明确的枚举顺序?

JavaScript ES6是否为对象属性引入了定义明确的枚举顺序?,第1张

JavaScript ES6是否为对象属性引入了定义明确的枚举顺序

注意: 从ES2020开始,甚至更旧的 *** 作(例如

for-in
和)
Object.keys
都必须遵循属性顺序。这不会改变以下事实:使用基本程序逻辑的属性顺序可能不是一个好主意,因为非整数索引属性的顺序取决于创建属性的时间。


ES2015-ES2019的答案:

对于

for-in
Object.keys
JSON.stringify

对于一些其他 *** 作: 是的 ,通常。

虽然ES6 / ES2015增加了财产秩序,它不需要

for-in
Object.keys
或者
JSON.stringify
遵循这一顺序,由于传统的兼容性问题。

for-in根据[[Enumerate]]循环循环,[[定义为(强调我的):

调用O的[[Enumerate]]内部方法时,将执行以下步骤:
返回一个Iterator对象(25.1.1.2),其下一个方法迭代O的所有可枚举属性的String值键。Iterator对象必须继承%IteratorPrototype%(25.1.2)。没有指定枚举属性的机制和顺序,但必须符合下面[1]中指定的规则。

ES7 /
ES2016删除了[[Enumerate]]内部方法,而是使用了抽象 *** 作EnumerateObjectProperties,但是就像[[Enumerate]]一样,它没有指定任何顺序。

也可以从查看此报价

Object.keys

如果实现为for-in语句定义了特定的枚举顺序,则[…]

这意味着不需要实现来定义特定的枚举顺序。ECMAscript 2015语言规范的项目编辑Allen Wirfs-Brock在规范完成后发表的帖子中已确认了这一点。

这意味着不需要实现来定义特定的枚举顺序。ECMAscript 2015语言规范的项目编辑Allen Wirfs-Brock在规范完成后发表的帖子中已确认了这一点。

其他 *** 作,如

Object.getOwnPropertyNames,Object.getOwnPropertySymbols,Object.defineProperties
,并
Reflect.ownKeys
做好后续普通物体下面的命令:

  1. 整数索引(如果适用),以升序排列。
  2. 其他字符串键(如果适用),按属性创建顺序。
  3. 符号键(如果适用),按属性创建顺序。

此行为在

[[OwnPropertyKeys]]
内部方法中定义。但是某些奇异的对象对内部方法的定义略有不同。例如,代理的
ownKeys
陷阱可能以任何顺序返回数组:

console.log(Reflect.ownKeys(new Proxy({}, {  ownKeys: () => ['3','1','2']}))); // ['3','1','2'], the integer indices are not sorted!

[1]它下面说:

[[Enumerate]]必须获得目标对象自己的属性键, 就像 通过调用其[[OwnPropertyKeys]]内部方法一样。

并且[[OwnPropertyKeys]]的顺序是明确定义的。但是,不要让您感到困惑:“好像”仅表示“相同的属性”,而不是“相同的顺序”。

可以在EnumerableOwnNames中看到,它使用[[OwnPropertyKeys]]获取属性,然后对它们进行排序

如果调用[[Enumerate]]内部方法,则返回的顺序与Iterator产生的顺序相同。

如果要求[[Enumerate]]以与[[OwnPropertyKeys]]相同的顺序进行迭代,则无需重新排序。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5110107.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-17
下一篇 2022-11-17

发表评论

登录后才能评论

评论列表(0条)

保存