forEach深度理解

2021-10-18 23:19:23 字數 1475 閱讀 6934

摘自ecma-262標準

15.4.4.18 陣列原型的foreach

22.1.3.10 陣列原型的foreach

23.1.3.12 陣列原型的foreach

以下內容是我將英文翻譯為中文並用自己的理解解釋(步驟部分為原版翻譯),僅供參考:

foreach方法接收兩個引數,第乙個引數是最多接收三個引數(索引值,索引,遍歷的物件)的函式,

foreach按索引公升序依次呼叫第乙個引數(也就是函式),注意只對特定項存在時呼叫該函式,如果不存在不會呼叫。

第二個引數是第乙個引數的this值,也就是說如果存在第二個引數,它將作為第乙個函式的this,如果沒有提供使用undefined,但是第乙個函式的this依舊是原來的this。

foreach本身不會改變遍歷的物件,而是通過第乙個引數改變物件。

呼叫callbackfn之前會首先執行遍歷的操作,遍歷完成之後才會依次呼叫函式,所以在foreach遍歷物件之後的變化不會被遍歷和呼叫,詳細的說就是在呼叫foreach之前和訪問之後**刪除**的屬性不會被其遍歷和呼叫。

// production steps of ecma-262, edition 5, 15.4.4.18

// reference:

!array.prototype.foreach)

// 1. 讓o作為呼叫tobject的結果,並將this值作為引數傳遞。

varo

=object

(this);

// 2. 設lenvalue為呼叫o的[[get]]內部方法,引數為"length"的結果。

// 3. 設len為touint32(lenvalue)。

var len =

o.length >>>0;

// 4. 如果iscallable(callbackfn)為false,則丟擲typeerror異常。

// see:

typeof callback !==

'function'

)// 5. 如果提供了thisarg,設t為thisarg;否則t為無定義。

if(arguments.length >1)

// 6. 設k為0。

k =0;

// 7. 重複,當k < len時

while

(k < len)

// d. k增加1。

k++;}

// 8. return undefined.};

}

筆記:

foreach函式故意是通用的;它不要求它的this值是乙個陣列物件。因此,它可以被轉移到其他型別的物件中作為方法使用。foreach函式是否能成功應用到主機物件取決於實現。

注:

三個版本,文字內容大同小異,原理一致

參見:mdn

php的foreach深度剖析

今天的操作中出現了如下的問題,下面試著解釋其中原因 先看看 arr array a b c foreach arr as key item var dump arr var dump current arr 複製 上面的 的結果為 aa bb cc bb 上面的第一行結果沒有問題,主要是考慮下面的結...

mybatis中的foreach的理解

使用環境是 當sql語句的限制範圍是乙個集合或者陣列的時候需要用foreach標籤遍歷其中的每乙個元素 屬性 collection 表示傳遞給sql語句的引數的key值,陣列為array,集合為list open 表示語句的開始 close 表示語句的結束需要新增的 item 每乙個元素的別名 se...

iframe深度理解

前言 如果你的頁面是乙個後台管理頁面,那麼你一定對iframe不陌生。從h5定稿開始,在涉及框架引入頁面時,統一建議使用iframe來進行相關的資源嵌入。使用場景 1 通常在不希望整體頁面跳轉,只需要主體頁面跳轉,則需要加入iframe標籤來作為展示頁面的視窗,通常在管理後台 qq郵箱等管理介面應用...