V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
unt
V2EX  ›  程序员

JSON.stringify()是否会改变元素顺序

  •  
  •   unt · 2023-02-03 12:44:23 +08:00 · 2221 次点击
    这是一个创建于 657 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一般情况下是不会的,但是不同浏览器、引擎、内核可能会有差别吧。

    请问什么情况下顺序会乱?

    如何保证顺序的准确性?

    8 条回复    2023-02-03 21:51:18 +08:00
    churchill
        1
    churchill  
       2023-02-03 12:59:09 +08:00   ❤️ 1
    如果序列化的对象是 Array ,那肯定是正确排序的。
    如果你说的是对象的 property ,现代浏览器上也是确定的
    这里有个讨论
    https://github.com/mdn/content/issues/16583
    lmshl
        2
    lmshl  
       2023-02-03 13:06:16 +08:00   ❤️ 3
    来自 tc39 ECMAScript Language Specification # sec-json.stringify
    你可以永远相信标准浏览器中的实现
    unt
        3
    unt  
    OP
       2023-02-03 13:07:39 +08:00
    @churchill #1 正常业务都是复杂的,比如说:
    {key:"ctrl",data:[{key:'key1',value:{a:1,b:2}},{key:'key2',value:{a:1,b:2}}]}
    676529483
        4
    676529483  
       2023-02-03 13:23:14 +08:00
    和 json 库没关系吧,本质是迭代器返回的顺序是否是固定的,这个不同语言不同对象不一样吧
    dog
        5
    dog  
       2023-02-03 13:44:52 +08:00
    有个小坑:chrome 控制台看到的 object 不一定跟 json 一样
    codewld
        6
    codewld  
       2023-02-03 13:46:32 +08:00
    ```javascript
    let obj = {a: 1, b: 2}
    let obj2 = {b: 2, a: 1}
    console.log(JSON.stringify(obj), JSON.stringify(obj2))
    // {"a":1,"b":2} {"b":2,"a":1}
    console.log(JSON.stringify(obj, ['a', 'b']), JSON.stringify(obj2, ['a', 'b']))
    // {"a":1,"b":2} {"a":1,"b":2}
    ```
    whileFalse
        7
    whileFalse  
       2023-02-03 15:42:25 +08:00 via iPhone
    不建议依赖这种特性 如果对属性的顺序敏感,可以像楼上说的那样通过数组存储
    izumiiAoba
        8
    izumiiAoba  
       2023-02-03 21:51:18 +08:00 via iPhone
    stackoverflow.com/questions/16167581
    用 `JSON.stringify` 第二个参数,可以实现按顺序
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:38 · PVG 04:38 · LAX 12:38 · JFK 15:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.