2017-09-27 16 views
1

由於properties order in objects is not guaranteed in JavaScriptJSON.stringify()實際上如何表現?由於JavaScript中不保證對象中的屬性順序,因此JSON.stringify()實際上如何表現?

  1. 以下總是如此(同一物體)?

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

  • 是對以下總是爲真(等於深對象,相同的密鑰聲明順序)?
  • console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ a: 1, b: 2 }));

  • 如何使以下爲真(等於深對象,不同的密鑰聲明順序)?
  • console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ b: 2, a: 1 }));

    +0

    1)是的,同一對象上的枚舉順序總是保證相同。 2)應該是,雖然沒有嚴格的保證,但我們期望確定性。 3)你不能「使」這是真的,你應該只使用[深層等式謂詞函數](https://stackoverflow.com/q/201183/1048572)而不是比較'JSON.stringify'結果 – Bergi

    回答

    2

    我看着ECMAScript標準爲JSON.stringifyhttp://www.ecma-international.org/ecma-262/5.1/#sec-15.12.3

    這似乎翔實:

    對於K.

    的每個元素P

    最後一步中的「追加」強烈暗示結果按源排序,我可以確認您的代碼斷言在Chromium和Firefox上都通過。

    編輯:對於「K的P」,這可能是相關的也:

    串的順序應該是一樣由Object.keys標準的內置函數使用。

    只要將比較結果保存在一個瀏覽器中,似乎您的斷言是真實的。

    +0

    號追加意味着該字符串按照「對於K的每個元素P」的順序構建,但並不意味着它們按源排序(或者對於動態生成的對象可能是這樣)。 – Bergi

    相關問題