成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊聊JS中Object的Keys是無序的嗎?

開發 前端
在 ES6 之后 Object 的鍵值對按照自然數、非自然數和 Symbol 進行排序,自然數是按照大小升序進行排序,其他兩種都是按照插入的時間順序進行排序。

在最開始學習 JavaScript 時,我一直被灌輸 Object 中的 Key 是無序的,不可靠的,而與之相對的是 Map 實例會維護鍵值對的插入順序。

「But,Object 的鍵值對真的是無序的嗎?」實際上在 ES2015 以后,Object.keys 的規則變了:

在一些現代的瀏覽器中,keys 輸出順序是可以預測的!

Key 都為自然數:

注意這里的自然數是指正整數或 0,如果是其他類的 Number —— 浮點數或者負數 —— 都會走到下一組類型里,像NaN或者Infinity這種也自然歸到下一個類型里,但是像科學記數法這個會稍微特殊一點,感興趣的同學可以自己試一下。

總結來說,就是當前的 key 如果是自然數就按照自然數的大小進行升序排序。

const objWithIndices = {
23: 23,
'1': 1,
1000: 1000
};

console.log(Reflect.ownKeys(objWithIndices)); // ["1", "23", "1000"]
console.log(Object.keys(objWithIndices)); // ["1", "23", "1000"]
console.log(Object.getOwnPropertyNames(objWithIndices)); // ["1", "23", "1000"]

包括在 for-in 循環的遍歷中,keys 也是按照這個順序執行的。

Key 都為 String:

如果 key 是不為自然數的 String(Number 也會轉為 String)處理,則按照加入的時間順序進行排序。

const objWithStrings = {
"002": "002",
c: 'c',
b: "b",
"001": "001",
}

console.log(Reflect.ownKeys(objWithStrings)); // ["002", "c", "b", "001"]
console.log(Object.keys(objWithStrings));// ["002", "c", "b", "001"]
console.log(Object.getOwnPropertyNames(objWithStrings));// ["002", "c", "b", "001"]

Key 都為symbol

const objWithSymbols = {
[Symbol("first")]: "first",
[Symbol("second")]: "second",
[Symbol("last")]: "last",
}

console.log(Reflect.ownKeys(objWithSymbols));// [Symbol(first), Symbol(second), Symbol(last)]
console.log(Object.keys(objWithSymbols));// [Symbol(first), Symbol(second), Symbol(last)]
console.log(Object.getOwnPropertyNames(objWithSymbols));// [Symbol(first), Symbol(second), Symbol(last)]

如果 Key 都為 Symbol,順序和 String 一樣,也是按照添加的順序進行排序的。

如果是以上類型的相互結合

const objWithStrings = {
"002": "002",
[Symbol("first")]: "first",
c: "c",
b: "b",
"100": "100",
"001": "001",
[Symbol("second")]: "second",
}

console.log(Reflect.ownKeys(objWithStrings));
// ["100", "002", "c", "b", "001", Symbol(first), Symbol(second)]

結果是先按照自然數升序進行排序,然后按照非數字的 String 的加入時間排序,然后按照 Symbol 的時間順序進行排序,也就是說他們會先按照上述的分類進行拆分,先按照自然數、非自然數、Symbol 的順序進行排序,然后根據上述三種類型下內部的順序進行排序。

Recap

  • 在 ES6 之前 Object 的鍵值對是無序的;
  • 在 ES6 之后 Object 的鍵值對按照自然數、非自然數和 Symbol 進行排序,自然數是按照大小升序進行排序,其他兩種都是按照插入的時間順序進行排序。

References:

「Property order is predictable in JavaScript objects since ES2015」: https://www.stefanjudis.com/today-i-learned/property-order-is-predictable-in-javascript-objects-since-es2015

「The traversal order of object properties in ES6」: http://2ality.com/2015/10/property-traversal-order-es6.html#traversing-the-own-keys-of-an-object

責任編輯:武曉燕 來源: Tecvan
相關推薦

2022-09-30 00:03:03

JS斷點線程

2022-10-08 00:07:00

JSV8調用棧

2020-11-19 08:04:10

JS變量Const

2021-03-03 13:13:35

JavaScriptObjectKeys

2024-05-31 09:31:00

2024-01-26 08:06:43

2021-09-26 05:06:04

Node.js模塊機制

2021-11-06 18:40:27

js底層模塊

2022-03-01 07:52:38

鏈表指針節點

2021-11-17 08:11:35

MySQL

2023-11-09 11:56:28

MySQL死鎖

2024-04-26 00:00:00

Rust檢查器代碼

2021-08-31 07:54:24

SQLDblink查詢

2020-09-30 14:24:58

PythonSet對象

2021-08-23 08:27:43

innodb數據庫存儲引擎

2022-02-11 09:31:23

IPV4IP地址IANA

2021-07-02 07:06:20

調試代碼crash

2021-10-22 08:29:14

JavaScript事件循環

2022-03-26 16:51:27

Node.jstrace架構

2020-01-09 12:30:20

架構運維技術
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.欧美视频 | 中文字幕亚洲国产 | 午夜精品三区 | 亚洲综合久久精品 | 久久久久国产 | 日韩在线视频播放 | 国产在线一级片 | 免费国产一区二区 | 中文字幕av在线 | 中文字幕高清av | 欧美日韩精品一区二区三区四区 | 国产午夜av片 | 日韩精品视频在线 | 成人在线视频网站 | 看毛片网站 | 干出白浆视频 | 久久久久久影院 | 日韩欧美高清 | 亚洲a视频| 欧美mv日韩mv国产网站91进入 | www精品美女久久久tv | 黑人巨大精品欧美一区二区免费 | 天天综合久久网 | 欧美日韩国产精品一区 | 一区二区三区av | 草久视频 | 天堂免费看片 | 91久久精品国产91久久 | 久久国产一区二区 | 91精品一区 | 在线成人免费观看 | 亚洲在线观看视频 | 国产不卡在线观看 | 亚洲天堂中文字幕 | 久久99国产精一区二区三区 | 亚洲综合一区二区三区 | 一道本在线 | 成人免费福利视频 | 久久婷婷麻豆国产91天堂 | 日韩欧美在线观看视频 | 99精品欧美一区二区蜜桃免费 |