JavaScript對象鍵序問題解析

問題的發現:

我有一個接口返回一個json數據瀏覽器network里的Response里是從大到小排。
在這里插入圖片描述
但Preview就是反過來的
在這里插入圖片描述

問題的描述:

上面那個讓我發現瀏覽器處理對象或者json是會對其鍵值對做排序!!!

在JavaScript中,對象鍵的順序問題源于語言規范:ES6之前對象鍵序沒有明確規定,ES6之后雖然規定了自有屬性的枚舉順序,但控制臺輸出可能因瀏覽器實現而異。

您觀察到的現象是正常的:當使用console.log(data)時,瀏覽器控制臺可能會按照以下規則顯示對象:

數字鍵按數值升序排列

字符串鍵按創建順序排列

但某些瀏覽器控制臺(如Chrome)會對所有鍵進行字母排序后再顯示

問題的復現:

示例一:key是一個字符串

let obj = {"2023-08-30": "8888","2023-08-10": "5555","2023-08-08": "6666","2023-06-02": "7777","2023-06-01": "7777",};// let obj = {//   "3-3": "cc",//   "3-2": "bb",//   "3-1": "aa",// };console.log("原數據:",obj);console.log("key數組:", Object.keys(obj));

示例一:key是一個日期字符串結果截圖
結果分析:
1.打印出的對象和原數據不一致被正序排序了
2.使用for in或者 Object.keys時鍵值的順序沒有發生變化

示例二:key是一個數字

   let obj = {20230830: "8888",20230810: "5555",20230808: "6666",20230602: "7777",20230601: "7777",};console.log("原數據:", obj);console.log("key數組:", Object.keys(obj));

示例二:key是一個數字
結果分析:
1.打印出的對象和原數據不一致被正序排序了
2.使用for in或者 Object.keys時鍵值的順序發生變化了

示例三:key是一個字母

   let obj = {c: "cc",b: "bb",a: "aa",};//   let obj = {//       "c": "cc",//       "b": "bb",//       "a": "aa",//    };console.log("原數據:", obj);console.log("key數組:", Object.keys(obj));

 示例三:key是一個字母

結果分析:
1.打印出的對象和原數據不一致被正序排序了
2.使用for in或者 Object.keys時鍵值的順序沒有發生變化

總結:

經過上面的三個示例可得出:
數字字符串鍵在對象屬性遍歷時會按數值升序排列。
非數字字符串鍵按照創建順序排列。
使用Map可以完全保留插入順序。

需要注意的是JSON.parse也使用這個規則!

關鍵結論:

對象鍵序問題原因:

控制臺顯示可能對鍵進行字母排序

JavaScript規范中對象鍵的順序是:整數索引 > 字符串鍵(按創建順序)> Symbol鍵

但字符串鍵中的數字字符串會被特殊處理

特殊處理的規則如下:

具體來說,ECMAScript規范規定,對象中的數字鍵(即數字字符串鍵)會按照數值大小升序排序,而非數字字符串鍵則按照創建順序排列。

特殊處理規則:
?數字字符串鍵?:會被視為數字索引,在對象屬性遍歷時(如使用Object.keys、for…in循環等)會按照數值升序排列。

?非數字字符串鍵?:按照屬性添加到對象的先后順序排列(從ES6開始,普通對象保持字符串鍵的創建順序,但數字字符串鍵仍然會被特殊排序)。

const obj = {"100": "一百","2": "二","name": "張三","1": "一","age": 20
};console.log(Object.keys(obj));
// 輸出: [ '1', '2', '100', 'name', 'age' ]

注意:
只有看起來像非負整數的字符串(例如"123"、“0”)才會被當作數字鍵處理。像"001"、"123a"這樣的字符串不會被當作數字鍵,而是普通字符串鍵。
在ES6之前,不同JavaScript引擎對非數字字符串鍵的遍歷順序是不一致的。但從ES6開始,規范要求非數字字符串鍵按照創建順序排列,而數字字符串鍵按照數值升序排列。

是否會影響使用:

直接通過鍵訪問屬性:不受影響

遍歷對象屬性(for…in/Object.keys):順序可能不符合預期

依賴對象鍵序的業務邏輯:可能有風險

推薦解決方案:

使用Map對象保持插入順序

使用數組顯式存儲鍵的順序

在遍歷前對鍵進行排序(如按日期倒序)

還需要注意的是控制臺打印對象時可能也會出現不一致的情況,詳情可以看:js 控制臺打印對象,對象點開后里面屬性沒值,展開后有值(object展開和收起值不一致)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/90204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/90204.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/90204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pandas庫的數據導入導出,缺失值,重復值處理和數據篩選,matplotlib庫 簡單圖繪制

目錄 一.數據導入導出 1.CSV文件讀取與參數說明 2.Excel與TST文件讀取 3.數據導出操作 二.缺失值處理 1.填充缺失值 2.刪除缺失值【刪除整行數據】 三.重復值處理 四.數據篩選與條件查詢 1.邏輯判斷取數 2.字符匹配 3.邏輯運算: &(和&…

FPGA?如何實現另一個?FPGA?

如果你對 FPGA 有些了解,大概知道它的意思是“可編程邏輯器件”,可以把寫好的邏輯電路(通常是 Verilog/VHDL)通過工具綜合、布局布線、燒寫進去,讓一塊芯片變成“你想要的電路”。但如果我告訴你,現在有個開…

文思助手、新華妙筆 AI材料星的公文寫作深度測評

公文寫作一直都是體制內工作人員的日常核心任務,寫公文的難點不僅來自于對政策表述嚴謹性的高要求,也在于格式規范、內容深度以及效率壓力的多重考驗。隨著AI技術的發展,越來越多的文字輔助工具出現,很大程度的緩解了寫作壓力&…

Flutter開發環境搭建與工具鏈

Flutter開發實戰第1章:Flutter開發環境搭建與工具鏈1.1 Flutter簡介與優勢Flutter是Google推出的開源UI工具包,用于從單一代碼庫構建編譯為原生性能的移動、Web和桌面應用程序。Flutter的核心優勢包括:跨平臺一致性:一套代碼運行在…

io_uring:Linux異步I/O的革命性突破

目錄 1. io_uring是什么? io_uring核心優勢: 2. io_uring核心原理 2.1 雙環形緩沖區設計 2.2 關鍵數據結構 1、完成隊列CQ 2、提交隊列SQ 3、Params 3. io_uring工作流程 3.1 初始化階段 3.2 I/O操作流程 4. C代碼示例(原始系統調…

線段樹學習筆記 - 練習題(2)

文章目錄1. 前言2. P3870 [TJOI2009] 開關3. P2184 貪婪大陸4. P1438 無聊的數列5. P1471 方差1. 前言 線段樹系列文章: 線段樹學習筆記。線段樹學習筆記 - 練習題(1)。 前一篇做了幾道線段樹的題目,這篇文章就繼續看下線段樹的…

Vue狀態管理:Pinia 與 Vuex 的使用方法與對比【文章附有完整案例】

最近在接手vue項目的需求,因為之前一直在做react的需求,日常的vue練習也少了很多,導致現在接手vue項目,很多關于vue的知識點基本上忘得干干凈凈了。但是好在有基礎,重新學也會很快掌握。分享這個過程中的一些復習內容。…

OpenMed 項目深度分析:推動醫療 NLP 領域的開源革命

摘要 醫療人工智能(AI)領域因高質量數據和模型的獲取受限而發展緩慢。OpenMed 項目通過開源超過380個醫療命名實體識別(NER)模型,顯著降低了研究與應用門檻。本文從項目背景、技術優勢、應用場景、實施挑戰及未來展望五個方面,系統分析 OpenMed 的核心價值與潛力,揭示其…

大模型開發

什么是Ai?AI的全拼是(Artificial Intelligence)人工智能,使機器能夠像人類一樣思考、學習和解決問題的技術。在AI的應用情況下我們更多的是學習自然語言處理。在自然語言處理(Natural Language Processing,NLP)中,有一項關鍵技術叫…

【正常配置了beast擴展,phpinfo信息也顯示了,但是就是不運行】

正常配置了beast擴展,phpinfo信息也顯示了,但是就是不運行場景原因解決排查過程擴展場景 項目中使用到了beast進行源碼保護,指定類存在,但是報錯信息提示類找不到,beast擴展添加到了正在運行的php版本下的ext文件夾下…

CRMEB 單商戶PRO多商戶通用去版權教程

CRMEB去版權教程,此教程可根據具體版本進行調整,基本適用次方法。 后端版權修改 修改后端管理底部版權及門店后端管理底部版權。 文件位置 \view\admin\src\components\copyright\index.vue 文件位置 \view\admin\src\router\routes.js 文件位置 \vi…

舊物回收小程序系統開發:重塑舊物回收產業新生態

在傳統觀念中,舊物回收往往給人一種臟亂差、效率低下的印象,回收過程繁瑣,回收渠道有限,導致許多可回收物被浪費。然而,隨著信息技術的飛速發展,舊物回收小程序系統的開發正為這一古老行業帶來前所未有的變…

SSE和WebSocket區別到底是什么

文章目錄SSE 與 WebSocket:深入剖析兩者核心差異核心差異:單向 vs. 雙向通信技術細節對比協議與連接數據格式錯誤處理與可靠性適用場景:何時選擇 SSE,何時選擇 WebSocket?總結SSE 與 WebSocket:深入剖析兩者…

西安電子科技大學金融學431考研經歷分享

考研數學是區分度最大的科目之一,如何高效備考?本文為你推薦多位名師和經典書籍,助你在每個階段都能穩步提升,最終沖刺成功。一、考研數學備考策略教師推薦① 高等數學:② 線性代數:③ 概率論與數理統計&am…

laravel RedisException: Connection refused優雅草PMS項目管理系統報錯解決-以及Redis 詳細指南-優雅草卓伊凡

laravel RedisException: Connection refused優雅草PMS項目管理系統報錯解決-以及Redis 詳細指南-優雅草卓伊凡今天來開始更新pms系統,因為我們ppt上面要做,才發現原來打不開,此前主要是事情太多,我們一直有很多東西擱置解決 Lara…

拉力覆冰在線監測裝置:電力線路安全運行的數字化守衛者

在極端天氣頻發的背景下,輸電線路覆冰災害已成為威脅電網穩定運行的關鍵因素。拉力覆冰在線監測裝置通過數字化技術構建起全天候監測體系,為電力運維提供精準數據支撐。本文從技術實現與實際應用價值角度,解析該裝置的核心功能與行業意義。核…

AI面試如何提升物流行業招聘效率?實戰案例解析

每年秋招季,物流行業都會迎來海量應屆生簡歷涌入。面對業務快速擴張與人才篩選壓力,傳統線下面試流程長、標準模糊、成本高昂等問題愈發凸顯。本文通過兩大物流頭部企業的實戰案例,解析AI面試如何破解招聘困局,實現效率與質量的雙…

【機器學習】組合優化問題combination-optimization概述

博主簡介:努力學習的22級計算機科學與技術本科生一枚🌸博主主頁: Yaoyao2024往期回顧:【二分圖算法】手把手教你學會:染色法(判斷二分圖)、匈牙利算法(二分圖的最大匹配)…

Linux網絡編程-osi、udp

網絡:不同主機,進程間通信達到不同主機之間的困難:解決主機之間的硬件層面的互聯互通解決主機之間的軟件層面的互聯互通廣域網:進行大范圍網絡數據交換IP地址:區分不同主機 唯一的(軟件地址)MAC…

刪除 XML 格式中雙引號內的空格

要使用 Shell 命令刪除 XML 格式中雙引號內的空格(僅處理屬性值中的空格,保留標簽外的空格),可以使用以下 sed 命令: sed -i :loop; s/\("[^"]*\) \([^"]*"\)/\1\2/g; t loop filename.xml命令詳解…