[英]Loop detection in javascript's built-in functions
我從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
是在this
值上調用ToObject
的結果。- 讓
func
成為使用參數"join"
調用array
的[[Get]]
內部方法的結果。- 如果
IsCallable(func)
為false
,則讓func
成為標准的內置方法Object.prototype.toString
(15.2.4.2)。- 返回調用
func
提供array
的[[Call]]
內部方法的結果作為this
值和空參數列表。注意
toString
函數是有意通用的; 它不要求它的this
值是一個Array
對象。 因此,它可以轉移到其他類型的對象以用作方法。toString
函數是否可以成功應用於宿主對象是依賴於實現的。
所有這些基本上意味着結果是對Array.prototype.join()
的調用,該調用在15.4.4.5
定義,並且不15.4.4.5
要求任何遞歸檢測:
[ECMA-262: 15.4.4.5]:
Array.prototype.join (separator)
數組的元素將轉換為
String
,然后連接這些String
,由分隔符的出現分隔。 如果未提供分隔符,則使用單個逗號作為分隔符。join方法接受一個參數
separator
,並執行以下步驟:
- 設
O
是調用ToObject
傳遞this
值作為參數的結果。- 設
lenVal
是用參數"length"
調用O
的[[Get]]
內部方法的結果。- 設
len
為ToUint32(lenVal).
- 如果
undefined
separator
,則讓separator
為單String
","
。- 設
sep
為ToString(separator)
。- 如果
len
zero
,則返回空String
。- 設
element0
是使用參數"0"
調用O
的[[Get]]
內部方法的結果。- 如果
element0
undefined
或為null
,則令R
為空String
; 否則,設R
為ToString(element0)
。- 設
k
為1。- 重復,而
k
<len
- 設
S
是連接R
和sep
產生的String
值。- 令
element
為使用參數ToString(k)
調用O
的[[Get]]
內部方法的結果。- 如果
element
undefined
或為null
,則next
是空String
; 否則,讓next
是ToString(element)
。- 令
R
為串聯S
和next
產生的String
值。- 將
k
增加1。- 返回
R
join
方法的length
屬性為1。注意
join
功能是有意通用的; 它不要求它的this
值是一個Array
對象。 因此,它可以轉移到其他種類的對象以用作方法。join
函數是否可以成功應用於宿主對象是依賴於實現的。
那么,這是一種標准保證的行為嗎? 沒有。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.