Since properties order in objects is not guarantee

2020-04-20 12:00发布

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条回答
叼着烟拽天下
2楼-- · 2020-04-20 12:13

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.

查看更多
登录 后发表回答