2013-03-31 8 views
6

私は、JavaScriptでJSON文字列にJSON.stringifyは、列挙できないプロパティをシリアル化しないのはなぜですか?

をオブジェクトをシリアル化するよ私だけ列挙オブジェクトのプロパティは、シリアライズ取得気づい:

var a = Object.create(null,{ 
    x: { writable:true, configurable:true, value: "hello",enumerable:false }, 
    y: { writable:true, configurable:true, value: "hello",enumerable:true } 
}); 
document.write(JSON.stringify(a)); //result is {"y":"hello"} 

[pen]

つまり、なぜ私は思ったんだけど?私はMDN pagejson2パーサのドキュメントを検索しました。 この動作がどこに書かれているかわかりませんでした。

これは、少なくともjson2の場合、only go through [[enumerable]]のプロパティのfor... inループを使用した結果と思われます。これはおそらく、Object.getOwnPropertyNamesのように、列挙可能なプロパティと列挙可能でないプロパティの両方を返すことで行うことができます。 (直列化によって)シリアル化するのは問題があるかもしれません。

TL; DR

  • はなぜJSON.stringifyのみ列挙プロパティをシリアル化しますか?
  • この動作はどこに文書化されていますか?
  • 非列挙型プロパティを自分でシリアル化する方法を教えてください。
+0

enumerableをfalseに設定すると、インスタンスが追加されません。文字列化する前にオブジェクトをコンソールにログオンしてみると、オブジェクト自体に 'x'がないことがわかります。文字列化されていれば確実にそこにはいられません。 – adeneo

+0

@adeneoそれはおそらく、stringifyのようなものもgetOwnPropertyNamesのようなものも使用しているからでしょう。 Object.getOwnPropertyNames(a)は["x"、 "y"]を返し、obj.xを入力すると "hello"を取得します。 –

+0

はい、私は気付きました。これは、おそらくオブジェクトを再考し、オブジェクトを作成する別の方法を見つけるべきであるという良い兆候です。 – adeneo

答えて

9

ES5 specで指定されています。

タイプ(値)がオブジェクトであり、IsCallable(値)だから、

If the [[Class]] internal property of value is "Array" then 

    Return the result of calling the abstract operation JA with argument value. 

Else, return the result of calling the abstract operation JO with argument value. 

falseの場合、のは、 JOを見てみましょう。

レッツKは、[[列挙]]属性がtrueある値のすべて独自のプロパティの名前からなる文字列の内部リストである:ここでは、関連するセクションです。ストリングの順序は、Object.keysの標準組み込み関数で使用されるものと同じでなければなりません。

+1

ああ、stringifyが仕様の一部であるとは思っていませんでしたが、これはまさに私が探していたものです。ありがとうございます。 –

関連する問題