簡體   English   中英

在javascript的內置函數中進行循環檢測

[英]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方法時,將執行以下步驟:

  1. array是在this值上調用ToObject的結果。
  2. func成為使用參數"join"調用array[[Get]]內部方法的結果。
  3. 如果IsCallable(func)false ,則讓func成為標准的內置方法Object.prototype.toString (15.2.4.2)。
  4. 返回調用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 ,並執行以下步驟:

  1. O是調用ToObject傳遞this值作為參數的結果。
  2. lenVal是用參數"length"調用O[[Get]]內部方法的結果。
  3. lenToUint32(lenVal).
  4. 如果undefined separator ,則讓separator為單String ","
  5. sepToString(separator)
  6. 如果len zero ,則返回空String
  7. element0是使用參數"0"調用O[[Get]]內部方法的結果。
  8. 如果element0 undefined或為null ,則令R為空String ; 否則,設RToString(element0)
  9. k為1。
  10. 重復,而k < len
    1. S是連接Rsep產生的String值。
    2. element為使用參數ToString(k)調用O[[Get]]內部方法的結果。
    3. 如果element undefined或為null ,則next是空String ; 否則,讓nextToString(element)
    4. R為串聯Snext產生的String值。
    5. k增加1。
  11. 返回R

join方法的length屬性為1。

注意 join功能是有意通用的; 它不要求它的this值是一個Array對象。 因此,它可以轉移到其他種類的對象以用作方法。 join函數是否可以成功應用於宿主對象是依賴於實現的。

那么,這是一種標准保證的行為嗎? 沒有。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM