的官方订购标准是Object.keys()
什么?
这不是订购的问题。这是一个超出标准的问题。
Kaushal Regmi
写道:
首先,作为升序数字索引的整数索引的键。然后,所有其他字符串键(按它们添加到对象的顺序)。最后,所有符号键(按它们添加到对象的顺序)。https://stackoverflow.com/a/57929312/10617101
到现在为止还挺好。如果对象只有整数作为键,则将按升序将其保存在Object.keys()
返回的数组中。如果键只是字母,则Object.keys()
返回的数组的顺序与被调用的顺序相同object{}
。我的问题是:这是JavaScript的通用通用标准吗?问题是:安全吗?
接下来,有一个小问题。(我不用这个)。
var object = { 3a: 'z', 1a: 'x', 2a: 'y' };
for (var i = 0; i < Object.keys(object).length; i++) {
console.log(Object.keys(object)[i]);
}
// Firefox: SyntaxError: identifier starts immediately after numeric literal
// Chrome: Uncaught SyntaxError: Invalid or unexpected token
var object = { a3: 'z', a1: 'x', a2: 'y' };
for (var i = 0; i < Object.keys(object).length; i++) {
console.log(Object.keys(object)[i]);
}
// works on both: [a3, a1, a2]
是的,解决方案是,使用另一种方法来创建object{}
:
var object = {};
object["3a"] = 'z';
object["1a"] = 'x';
object["2a"] = 'y';
for (var i = 0; i < Object.keys(object).length; i++) {
console.log(Object.keys(object)[i]);
}
// [3a, 1a, 2a]
编辑:特殊的问题是对象关键字作为引号中的整数:
var object = { "3": "z", "1": "x", "2": "y" };
for (var i = 0; i < Object.keys(object).length; i++) {
console.log(Object.keys(object)[i]);
} // [1, 2, 3]
通常,“ 1”是字符串,而1是整数,但是作为对象键“ 1”仍然是整数。(但不是真正通过对象键进行数学运算)。
因此,顺便问一下我的问题,订单中的官方标准是什么。以及这有多安全。
的规范Object.keys()
很大程度上是对规范内部操作EnumerableOwnPropertyNames的包装。反过来,这说明
对属性的元素进行排序,以使它们具有与Iterator产生的相对顺序相同的相对顺序(如果使用O调用EnumerateObjectProperties内部方法,则返回该迭代器)。
未指定枚举属性的机制和顺序,但必须符合以下指定的规则。
并从下面的内容中,找到与您的问题有关的以下内容:
- 返回的属性键不包括作为符号的键。
- 在任何枚举中,属性名称最多将返回一次。
因此,根据规格,根本没有的真正订购保证Object.keys()
。只是一些非常基本的不变式。
这对适用于EnumerateObjectProperties的语言的其他部分也适用,尤其是for
- in
。
与此形成鲜明对比的Reflect.ownKeys()
是,至少对于普通对象而言,它在OrdinaryOwnPropertyKeys中达到最低。在那里,命令是
- O的每个自己的属性键P(它是数组索引),按数字索引升序执行
- O的每个自己的属性键P(按字符串排列,但不是数组索引),按属性创建的时间顺序升序排列
- O的每个自身属性键P(即符号),按照属性创建的时间顺序升序排列
即对于该方法,有一个明确规定的顺序。(这同样适用于OrdinaryOwnPropertyKeys中触底的其他方法,例如Object.getOwnPropertyDescriptors()
。
当前有一个积极的建议,试图对EnumerateObjectProperties顺序(因此对for
-)指定更严格的限制in
。它的方法是找到涉及受限原型链和枚举的场景,其中没有奇怪的事情发生,并Reflect.ownKeys()
为原型链中的每个级别选择与执行相同的顺序。我对建议的理解是,专门应用于Object.keys()
,它将使其行为与Reflect.ownKeys()
普通对象相同。我在提案中提出了一个问题,以查看我是否正确,如果是正确的话,则使其更加明确。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句