Ответ 1
[ECMA-262: 15.4.4.2]:
Array.prototype.toString ( )
Когда вызывается метод
toString
, выполняются следующие шаги:
- Пусть
array
является результатом вызоваToObject
по значениюthis
.- Пусть
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
затем объединяются, разделяются вхождениями разделителя. Если разделитель не предусмотрен, в качестве разделителя используется одна запятая.Метод join принимает один аргумент
separator
и выполняет следующие шаги:
- Пусть
O
является результатом вызоваToObject
, передающего значениеthis
в качестве аргумента.- Пусть
lenVal
является результатом вызова внутреннего метода[[Get]]
O
с аргументом"length"
.- Пусть
len
beToUint32(lenVal).
- Если
separator
-undefined
, пустьseparator
- односимвольныйString
","
.- Пусть
sep
beToString(separator)
.- Если
len
-zero
, верните пустойString
.- Пусть
element0
является результатом вызова внутреннего метода[[Get]]
O
с аргументом"0"
.- Если
element0
-undefined
илиnull
, пустьR
- пустойString
; в противном случае пустьR
beToString(element0)
.- Пусть
k
будет 1.- Повторите, а
k
<len
- Пусть
S
- значениеString
, созданное путем объединенияR
иsep
.- Пусть
element
является результатом вызова внутреннего метода[[Get]]
O
с аргументомToString(k)
.- Если
element
-undefined
илиnull
, пустьnext
- пустойString
; в противном случае пустьnext
ToString(element)
.- Пусть
R
будет значениемString
, созданным конкатенациейS
иnext
.- Увеличить
k
на 1.- Возврат
R
.Свойство
length
методаjoin
равно 1.ПРИМЕЧАНИЕ Функция
join
намеренно является общей; он не требует, чтобы его значениеthis
представляло собой объектarray
. Поэтому он может быть передан другим типам объектов для использования в качестве метода. Может ли функцияjoin
успешно применяться к объекту хоста, зависит от реализации.
Итак, это стандартно-гарантированное поведение? Нет.