Chromeデベロッパーツールのコンソールから次のトレースを取得しました。
> a = [1]
[1]
> b = [2, a]
[2, Array[1]]
> a.push(b)
2
> a.toString()
"1,2,"
toString()オブジェクトグラフの再帰部分をインテリジェントにスキップしたようです。これはどこかに文書化されている標準的な動作ですか?
Chromeデベロッパーツールのコンソールから次のトレースを取得しました。
> a = [1]
[1]
> b = [2, a]
[2, Array[1]]
> a.push(b)
2
> a.toString()
"1,2,"
toString()オブジェクトグラフの再帰部分をインテリジェントにスキップしたようです。これはどこかに文書化されている標準的な動作ですか?
[ECMA-262: 15.4.4.2]:Array.prototype.toString ( )
toStringメソッドが呼び出されると、次の手順が実行されます。
array値を呼び出した結果にしToObjectましょうthis。- with引数の内部メソッドを
func呼び出した結果とします。[[Get]]array"join"- の場合
IsCallable(func)はfalse、func標準の組み込みメソッドObject.prototype.toString(15.2.4.2)とします。- 値として提供する
[[Call]]内部メソッドと空の引数リストを呼び出した結果を返します。funcarraythis注この
toString関数は意図的に汎用的です。そのthis値がArrayオブジェクトである必要はありません。したがって、メソッドとして使用するために他の種類のオブジェクトに転送できます。toString関数をホストオブジェクトに正常に適用できるかどうかは、実装によって異なります。
これはすべて、基本的に、結果がへの呼び出しであることを意味しますArray.prototype.join()。これはで定義されて15.4.4.5おり、再帰検出を義務付けていません。
[ECMA-262: 15.4.4.5]:Array.prototype.join (separator)配列の要素は
Stringsに変換され、次にこれらStringのsが連結され、区切り文字の出現によって分離されます。区切り文字が指定されていない場合は、1つのコンマが区切り文字として使用されます。joinメソッドは1つの引数、を取り
separator、次の手順を実行します。
- 引数として値を渡して
O呼び出した結果とします。ToObjectthis- with引数の内部メソッドを
lenVal呼び出した結果とします。[[Get]]O"length"- なりましょ
lenうToUint32(lenVal).- の場合
separatorはundefined、separator1文字としString","ます。- なりましょ
sepうToString(separator)。- の場合、空のを返し
lenます。zeroString- with引数の内部メソッドを
element0呼び出した結果とします。[[Get]]O"0"element0isundefinedまたはnull、の場合はR、空にしStringます; それ以外の場合は、にしましょRうToString(element0)。- 1にしましょう
k。- 繰り返しますが、
k<len
- とを連結して生成される値と
Sします。StringRsep- with引数の内部メソッドを
element呼び出した結果とします。[[Get]]OToString(k)elementがundefinedまたはの場合null、next空になりStringます; それ以外の場合は、としnextますToString(element)。- とを連結して生成される値と
Rします。StringSnext- 1ずつ増やし
kます。- 戻り
Rます。メソッドの
lengthプロパティjoinは1です。注この
join関数は意図的に汎用的です。そのthis値がArrayオブジェクトである必要はありません。したがって、メソッドとして使用するために他の種類のオブジェクトに転送することができます。join関数をホストオブジェクトに正常に適用できるかどうかは、実装によって異なります。
それで、それは標準的に保証された振る舞いですか?いいえ。