问题的发现:

我有一个接口返回一个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命令详解…