面试官:JavaScript对象属性是有序的吗?

最近有人问我,JavaScript对象属性是否一定是无序的、不可预测的?

早期接触过JavaScript的开发者可能会回答,Object.keys()或for…in会返回一个不可预知的对象属性顺序

但现在的情况仍然是这样吗?

不是了,有些情况下是有序的。

从ECMAScript 2020开始,Object.key、for…in、Object.getOwnPropertyNames和Reflect.ownKeys都遵循同一个规范顺序。它们是:

1. 自己的属性是数组的索引,按数字索引升序排列

const obj = { 100: 100, ‘2’: 2, 12: 12, ‘0’: 0}// 下面打印的结果顺序都是 [‘0’, ‘2’, ’12’, ‘100’]console.log(Object.keys(obj))console.log(Object.getOwnPropertyNames(obj))console.log(Reflect.ownKeys(obj))for (const key in obj) { console.log(‘key’, key)}const obj = { a: ‘a’,};obj.b = ‘b’;setTimeout(() => { obj.c = ‘c’;});obj.d = ‘d’;// 下面打印的结果顺序都是 `[ ‘a’, ‘b’, ‘d’ ]`console.log(Object.keys(obj));console.log(Object.getOwnPropertyNames(obj));console.log(Reflect.ownKeys(obj));for (const key in obj) { console.log(‘key: ‘, key);}

上面的代码添加了事件循环的知识点。因为 setTimeout 是一个异步的宏任务,当console.log输出时,c属性还没有被添加到 obj 中。

3. 自身的 Symbol 属性,按创建时间顺序递增

const obj = { [Symbol(‘a’)]: ‘a’, [Symbol.for(‘b’)]: ‘b’,};obj[Symbol(‘c’)] = ‘c’;console.log(Object.keys(obj)); // []console.log(Object.getOwnPropertyNames(obj)); // []console.log(Reflect.ownKeys(obj)); // [ Symbol(a), Symbol(b), Symbol(c) ]for (const key in obj) { console.log(‘key: ‘, key); // 没有输出}console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(a), Symbol(b), Symbol(c) ]

Symbol 属性和 String 属性一样,是按照属性创建的时间顺序升序排列的。但是Object.key, for…in, Object.getOwnPropertyNames方法不能获得对象的 Symbol 属性,Reflect.ownKeys和 Object.getOwnPropertySymbols 可以。

总结

当一个对象的属性键是上述类型的组合时,该对象的非负整数键(可枚举和不可枚举)首先按升序添加到数组中,然后按插入顺序添加字符串键。最后,Symbol 键按插入顺序加入。

const obj = { 100: 100, 0: 0, a: ‘a’, [Symbol(‘a’)]: ‘a’,};obj[Symbol.for(‘b’)] = ‘b’;obj.b = ‘b’;console.log(Object.keys(obj)); // [ ‘0’, ‘100’, ‘a’, ‘b’ ]console.log(Object.getOwnPropertyNames(obj)); // [ ‘0’, ‘100’, ‘a’, ‘b’ ]console.log(Reflect.ownKeys(obj)); // [ ‘0’, ‘100’, ‘a’, ‘b’, Symbol(a), Symbol(b) ]for (const key in obj) { console.log(‘key: ‘, key); // ‘0’ ‘100’ ‘a’ ‘b’}console.log(Object.getOwnPropertySymbols(obj)); // [ Symbol(a), Symbol(b) ]

但是,如果你强烈依赖插入顺序,那么Map可以保证这一点


作者:islizeqiang 译者:小智 来源:medium 原文:https://medium.com/@islizeqiang/are-javascript-object-properties-ordered-c30597754e5c

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月15日
下一篇 2022年7月15日

相关推荐

  • 2022七星连珠具体什么时候出现?附最新准确时间

    据介绍,再过几天,百年一遇的“七星连珠”天象将会在空中上演。有专家表示,此次七星连珠很有可能在晚上,因此可以达到极好的观测效果,会是今年最值得期待的天象之一了。那么2022七星连珠…

    2022年7月31日
  • 荣耀5000mAh旗舰曝光,120倍变焦+16GB+骁龙8 Gen2,机皇气质拿捏

    对于荣耀手机来说,有优势也有劣势。优势上它继承了华为手机的优秀基因,同时还补足了5G网络的遗憾,同时还有华为原有工程师研发团队以及供应链底子加持,所以荣耀手机在信号、拍照等方面也是…

    2022年7月30日
  • 全自动机械手表分享:双子星机械手表

    对待自己怎么能轻易妥协,手表也要选择适合自己的。不同寻常的创意手表,雷诺解构派双子星机械手表,打破时空概念,造就全新体验。 无惧他人眼光,追求新潮个性,双星吸引,走在时尚前线。双面…

    2022年8月20日
  • 3.属性伤害,获取真凶

    新手很喜欢问:怎么做属性伤害?然后我们就会回答自定义值绑定。  通常需要自定义值绑定的属性伤害不是指那些一点目标就造成伤害的技能;或者说伤害来源脱离英雄本身,也就是马甲伤害,我们才…

    2022年6月28日
  • 独家专访 – 刘畊宏:红与不红都要跳

    当你成为刘畊宏男孩女孩的时候,其实是你对健康生活方式有一种憧憬和向往。 本刊记者/蔡春燕 就像坐上了火箭一般,2022年的春天,刘畊宏“意外”爆红了。 四五月的上海正经历着一场突如…

    2022年6月15日
  • 三星因手机防水广告被罚6600万

    7月29日消息,据Phone Arena报道,澳大利亚法院法官Brendan Murphy下令三星电子澳大利亚公司在30天内支付1400万澳元罚款(约合人民币6600多万元),对此…

    2022年8月2日
  • 8月~12月,退休人员将领到8笔钱!4笔补发4笔补贴哪个关系你?

    眼看8月就要过完了,7月份全国进行了集中上调职工养老金的措施,大批退休人员都拿到了上半年补发的钱,不过,事关退休人员们,其实补发和补贴的发放还不止于此,这8笔钱也将在8月~12月的…

    2022年8月26日
  • iPhone 14系列机模外形遭曝光,今年采用挖孔屏“确定无疑”

    随着苹果秋季新品发布会的临近,网上关于新款 iPhone 消息也逐渐多了起来。近日,在微博上就有博主放出了一张疑似 iPhone 14 Pro Max的模型照片, 从而引发了网友的…

    2022年7月24日
  • 再放纵不羁的梦想,有一天也会尘埃落定

    曾经的青春年少,都有着一颗放纵不羁的梦想,总想着年少有为,定能成大事,随着时间推移,经历社会的洗刷后,才发现,梦想还是要有的,不过他终究是人心里的一个希望,最终还是被现实征服,如今…

    2022年6月27日
  • AOKZOE 掌机将首发 R7 6800U,《地平线5》可达 100fps

    IT之家 6 月 24 日消息,AOKZOE 掌机今天宣布将首发 AMD R7 6800U,预计将在 7 月份天猫预售。 IT之家了解到,这款 Windows 掌机搭载了 R7 6…

    2022年6月25日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息