訳の正確性を保証するものではありませんので必要に応じて原文であるEcma InternationalのECMA-262にある ECMA-262.pdf ( ECMA-262 5.1 Edition )を参照下さい。
訳:2012年04月 webzoit.net
stringify(文字列化)関数は、ECMAScriptの値を表すJSON形式の文字列を返します。 それは、3つのパラメータを取ります。 1つめのパラメータは、必須です。 value パラメータは、ECMAScriptの値であり、それは通常のオブジェクトや配列で文字列、ブール(ブーリアン)、数値、null でも可です。 オプションの replacer パラメータは、オブジェクトと配列が文字列化される方法や文字列化されるであろうオブジェクトのプロパティを選択することによってホワイトリストとして動作する文字列と数値の配列の何れかを変更する機能です。 オプションの space パラメータは、人間が読解可能なことを保証する為にそれに挟んみ込んだホワイトスペースのある結果を許容する文字列や数値です。 これらは、任意のオブジェクトを文字列化する際のステップです。
1. stack は、カラのリストとする 2. indent は、カラの文字列とする 3. PropertyList と ReplacerFunction は、 undefined とする 4. Type(replacer) が、 Object である場合、 a. IsCallable(replacer) が、 true である場合、 i. ReplacerFunction は、 replacer とする b. replacer の内部プロパティ[[Class]]が、"Array" である場合、 i. PropertyList は、カラの内部リストとする ii. replacer のプロパティの値 v ごとに配列インデックスプロパティ名を持つ プロパティは、それらの名称の配列インデックス順における昇順で列挙される 1. item は、 undefined とする 2. Type(v) が、 String である場合、 item は、 v とする 3. Type(v) が、 Number である場合、 item は、 ToString(v) とする 4. Type(v) が、 Object である場合、 a v の内部プロパティ[[Class]]が、"String" または、 "Number" である場合、 item は、 ToString(v) とする 5. item が、undefined でなく、且つ、 item が、現在の PropertyList の要素ではない場合、 a PropertyList の末尾に item を付加する 5. Type(space) が、 Object である場合、 a. space の内部プロパティ[[Class]]が、"Number"である場合、 i. space は、 ToNumber(space) とする b. space の内部プロパティ[[Class]]が、"String"である場合、 i. space は、 ToString(space) とする 6. Type(space) が、 Number である場合、 a. space は、 min(10, ToInteger(space)) とする b. gap に空白文字 space を含むStringを設定する これは、 space が、1よりも小さい場合、カラの文字列となるでしょう。 7. Type(space) が、 String である場合、 a. space 内にある文字数が、 10未満である場合、 gap に space を設定し、それ以外の場合、 gap に space の最初の10文字を含む文字列を設定 8.それ以外の場合、 a. gap にカラの文字列を設定する 9. wrapper は、その名称を持つ標準組み込みコンストラクタであるObjectを式 new Object() によるかのように生成した新たなオブジェクトとする 10.引数にカラの文字列、プロパティ記述子 {[[Value]]: value, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}、 false を伴う wrapper の内部メソッド[[DefineOwnProperty]]を呼ぶ 11.カラの文字列と wrapper を伴う抽象操作 Str を呼んだ結果を返す
抽象操作 Str(key, holder) は、stringifyメソッドの呼び出しによる ReplacerFunction へのアクセスを持ちます。 そのアルゴリズムは、次のようになります。
1. value は、引数 key を伴う holder の内部メソッド[[Get]]を呼んだ結果とする 2. Type(value) が、 Object である場合、 a. toJSON は、引数 "toJSON"を伴う value の内部メソッド[[Get]]を呼んだ結果とする b. IsCallable(toJSON) が、 true である場合、 i. value は、 this 値として value と keyから構成される引数リストを渡して toJSON の内部メソッド[[Call]]を呼んだ結果とする 3. ReplacerFunction が、 undefined ではない場合、 a. value は、 this 値として holder と key と value で構成される引数リストを渡して ReplacerFunction の内部メソッド[[Call]]を呼んだ結果とする 4. Type(value) が、 Object である場合、 a. value の内部プロパティ[[Class]]が、"Number"である場合、 i. value は、 ToNumber(value) とする b. value の内部プロパティ[[Class]]が、"String"である場合、 i. value は、 ToString(value) とする c. value の内部プロパティ[[Class]]が、"Boolean"である場合、 i. value は、value の内部プロパティ[[PrimitiveValue]]の値とする 5. value が、 null である場合、"null"を返す 6. value が、 true である場合、"true"を返す 7. value が、 false である場合、"false"を返す 8. Type(value) が、 String である場合、引数 value を伴う抽象操作 Quote を呼んだ結果を返す 9. Type(value) が、 Number である場合、 a. value が、有限である場合、 ToString(value) を返す b.それ以外の場合、"null"を返す 10. Type(value) が、 Object、且つ、 IsCallable(value) が、 false である場合、 a. value の内部プロパティ[[Class]]が、"Array"である場合、 i.引数 value を伴う抽象操作 JA を呼んだ結果を返す b.それ以外の場合、引数 value を伴う抽象操作 JO を呼んだ結果を返す 11. undefined を返す
抽象操作 Quote(value) は、その中にあるダブルクォートとエスケープ文字内の文字列値を囲みます。
1. product は、ダブルクォート文字とする 2. value 内の文字 C ごとに a. C が、ダブルクォート文字、または、バックスラッシュ文字である場合、 i. product は、 product とバックスラッシュ文字を連結したものとする ii. product は、 product と C を連結したものとする b. C が、バックスペース、フォームフィード、ニューライン、キャリッジリターン、タブ である場合、 i. product は、 product とバックスラッシュ文字を連結したものとする ii. abbrev は、次のような C の値と一致する文字とする backspace "b" formfeed "f" newline "n" carriage return "r" tab "t" iii. product は、 product と abbrev を連結したものとする c. C が、その空白文字よりも小さいコードユニット値を持つ制御文字である場合、 i. product は、 product とバックスラッシュ文字を連結したものとする ii. product は、 product と "u" を連結したものとする iii. hex は、 C の数値のコードユニット値を4つの16進数から成る文字列に変換した結果とする iv. product は、 product と hex を連結したものとする d.それ以外の場合、 i. product は、 product と C を連結したものとする 3. product は、 product とダブルクォート文字を連結したものとする 4. product を返す
抽象操作 JO(value) は、任意のオブジェクトをシリアライズします。 stringify メソッドの呼び出しとして stack、 indent、 gap、 PropertyList、 ReplacerFunction、 space へのアクセス権を持ちます。
1. stack が、 value を含む場合、構造が循環的(循環構造)である為、TypeError例外を投げる(スローする) 2. stack に value を付加 3. stepback は、 indent とする 4. indent は、 indent と gap を連結したものとする 5. PropertyList が、undefined ではない場合、 a. K は、 PropertyList とする 6.それ以外の場合、 a. K は、[[Enumerable]]属性がtrueである value 自身のプロパティ全ての名称から成る文字列の内部リストとする 文字列の順序は、標準組み込み関数 Object.keys によって使用したのと同様とすべき 7. partial は、カラのリストとする 8. K の要素 P ごとに a. strP は、引数 P と value を伴う抽象操作 Str を呼んだ結果とする b. strP が、 undefined ではない場合、 i. member は、引数 P を伴う抽象操作 Quote を呼んだ結果とする ii. member は、 member とコロン文字を連結したものとする iii. gap がカラの文字列ではない場合、 1. member は、 member と空白文字を連結したものとする iv. member は、 member と strP を連結したものとする v. partial に member を付加する 9. partial がカラである場合、 a. final は、 "{}" とする 10.それ以外の場合、 a. gap が、カラの文字列である場合、 i. properties は、カンマ文字を伴って分割した文字列の隣接するペアごとの一部の要素の文字列全てを連結することによって形成した文字列とする カンマは、最初の文字列の前、または、最後の文字列の後の何れかには挿入されない ii. final は、"{"、 properties 、 "}" を連結した結果とする b.それ以外の場合、 gap は、カラの文字列ではなく、 i. separator は、カンマ文字、ラインフィード文字、 indent を連結した結果とする ii. properties は、セパレータを伴って分割した文字列の隣接するペアごとに一部の要素の文字列全てを連結することによって形成した文字列とする セパレータ文字列は、最初の文字列の前、または、最後の文字列の後の何れかには挿入されない iii. final は、 "{"、 そのラインフィード文字、 indent、 properties、そのラインフィード文字、stepback、"}" を連結した結果とする 11. stack の最後の要素を削除する 12. indent は、 stepback とする 13. final を返す
抽象操作 JA(value) は、任意の配列をシリアライズします。 stringifyメソッドの呼び出しとして stack, indent, gap, space へのアクセス権を持ちます。 配列の表現としては、ゼロと array.length - 1 を含むその間の要素のみを含みます。 名前付きプロパティは、文字列化から除外されます。 任意の配列は、開始左ブラケット、カンマ区切りの要素、閉じ右ブラケットとして文字列化されます。
1. stack が、 value を含む場合、構造が循環する為、TypeError例外を投げる(スローする) 2. stack に value を付加(追加) 3. stepback は、 indent とする 4. indent は、 indent と gap の連結したものとする 5. partial は、カラのリストとする 6. len は、引数"length"を伴う value の内部メソッド[[Get]]を呼んだ結果とする 7. index は、 0 とする 8. while index < len という条件下で繰り返す a. strP は、引数 ToString(index) と value を伴う抽象操作 Str を呼んだ結果とする b. strP が、 undefined である場合、 i. partial に "null" を付加(追加) c.それ以外の場合、 i. partial に strP を付加(追加) d. index を1で増分する 9. partial が、カラである場合、 a. final は、 "[]" とする 10.それ以外の場合、 a. gap が、カラの文字列である場合、 i. properties は、カンマ文字を伴って分割した隣接する文字列のペアごとに partial の要素文字列全てを連結することによって形成した文字列とする カンマは、最初の文字列の前、または、最後の文字列の後に挿入されることはないものとする ii. final は、 "[", properties, "]" を連結した結果とする b. それ以外の場合、 i. separator は、カンマ文字、ラインフィード文字、 indent を連結した結果とする ii. properties は、セパレータで区切られた隣接する文字列のペアごとに partial の要素文字列全てを連結することによって形成した文字列とする セパレータ文字は、最初文字列の前、または、最後の文字列の後に挿入されることはないものとする iii. final は、"["、 そのラインフィード文字、indent 、 properties 、そのラインフィード文字、 stepback 、"]" を連結した結果とする 11. stack の最後の要素を削除する 12. indent は、 stepback とする 13. final を返す
[注釈 1] JSON構造は、任意の深さにネストされることが許容されますが、非循環としなければいけません。 value が存在したり、循環構造を含む場合、stringify関数は、TypeError例外を投げ(スローし)ます。 これは、文字列化されることができない値の例です。
a = []; a[0] = a; my_text = JSON.stringify(a); // これは、TypeErrorを投げなければいけない
[注釈 2] シンボリックプリミティブ値は、次のように描画(レンダリング)されます。
[注釈 3] String値は、ダブルクォートで囲います。 文字 " と \ は、接頭辞 \ でエスケープされます。 制御文字は、エスケープシーケンス \uHHHH や略記 \b (backspace), \f (formfeed), \n (newline), \r (carriage return), \t (tab) で置換されます。 [注釈 4] 有限の数値は、 ToString(number) を呼ぶことによるかのように文字列化されます。 符号に関わらず、NaN と無限大は、文字列 null として表現されます。 [注釈 5] (undefinedと関数のような)JSON表現を持たない値は、文字列を生成しません。 代わりにそれらは、undefined(未定義)値を生成します。 配列内のこれらの値は、文字列 null として表現されます。 オブジェクト内の表現できない値は、文字列化から除外されるプロパティの要因になります。 [注釈 6] 任意のオブジェクトは、ゼロ個以上のプロパティが続く開始左波かっこ(brace)、カンマ区切り、右閉じ波かっことして描画されます。 任意のプロパティは、キーやプロパティ名、コロン、それから文字列化したプロパティ値を表しているクォートした文字列です。 任意の配列は、ゼロ個以上の値が続く左開始ブラケット(角かっこ)、カンマ区切り、右閉じブラケットとして描画されます。