Since properties order in objects is not guaranteed in JavaScript, how does JSON.stringify() actually behave?

五迷三道 提交于 2019-12-02 08:19:16

问题


Since properties order in objects is not guaranteed in JavaScript, how does JSON.stringify() actually behave?

  1. Is the following always true (same object)?

const o = { a: 1, b: 2 };
console.log(JSON.stringify(o) === JSON.stringify(o));
  1. Is the following always true (deeply equal objects, same key declaration order)?

console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ a: 1, b: 2 }));
  1. How to make the following be true (deeply equal objects, different key declaration order)?

console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ b: 2, a: 1 }));

回答1:


I looked at the ECMAScript standard for JSON.stringify: http://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3

This seems informative:

For each element P of K.

Let strP be the result of calling the abstract operation Str with arguments P and value.
If strP is not undefined
    Let member be the result of calling the abstract operation Quote with argument P.
    Let member be the concatenation of member and the colon character.
    If gap is not the empty String
        Let member be the concatenation of member and the space character.
    Let member be the concatenation of member and strP.
    Append member to partial.

The "append" in the final step strongly implies that the results are ordered per the source, and I can confirm your code assertions pass on both Chromium and Firefox.

EDIT: For "P of K", this might be relevant too:

The ordering of the Strings should be the same as that used by the Object.keys standard built-in function.

It seems that your assertions are true so long as the comparisons are kept in one browser.



来源:https://stackoverflow.com/questions/46444607/since-properties-order-in-objects-is-not-guaranteed-in-javascript-how-does-json

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!