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]]
内部メソッドと空の引数リストを呼び出した結果を返します。func
array
this
注この
toString
関数は意図的に汎用的です。そのthis
値がArray
オブジェクトである必要はありません。したがって、メソッドとして使用するために他の種類のオブジェクトに転送できます。toString
関数をホストオブジェクトに正常に適用できるかどうかは、実装によって異なります。
これはすべて、基本的に、結果がへの呼び出しであることを意味しますArray.prototype.join()
。これはで定義されて15.4.4.5
おり、再帰検出を義務付けていません。
[ECMA-262: 15.4.4.5]:
Array.prototype.join (separator)
配列の要素は
String
sに変換され、次にこれらString
のsが連結され、区切り文字の出現によって分離されます。区切り文字が指定されていない場合は、1つのコンマが区切り文字として使用されます。joinメソッドは1つの引数、を取り
separator
、次の手順を実行します。
- 引数として値を渡して
O
呼び出した結果とします。ToObject
this
- with引数の内部メソッドを
lenVal
呼び出した結果とします。[[Get]]
O
"length"
- なりましょ
len
うToUint32(lenVal).
- の場合
separator
はundefined
、separator
1文字としString
","
ます。- なりましょ
sep
うToString(separator)
。- の場合、空のを返し
len
ます。zero
String
- with引数の内部メソッドを
element0
呼び出した結果とします。[[Get]]
O
"0"
element0
isundefined
またはnull
、の場合はR
、空にしString
ます; それ以外の場合は、にしましょR
うToString(element0)
。- 1にしましょう
k
。- 繰り返しますが、
k
<len
- とを連結して生成される値と
S
します。String
R
sep
- with引数の内部メソッドを
element
呼び出した結果とします。[[Get]]
O
ToString(k)
element
がundefined
またはの場合null
、next
空になりString
ます; それ以外の場合は、としnext
ますToString(element)
。- とを連結して生成される値と
R
します。String
S
next
- 1ずつ増やし
k
ます。- 戻り
R
ます。メソッドの
length
プロパティjoin
は1です。注この
join
関数は意図的に汎用的です。そのthis
値がArray
オブジェクトである必要はありません。したがって、メソッドとして使用するために他の種類のオブジェクトに転送することができます。join
関数をホストオブジェクトに正常に適用できるかどうかは、実装によって異なります。
それで、それは標準的に保証された振る舞いですか?いいえ。