簡體   English   中英

forEach循環數組與胖箭頭

[英]forEach loop on array with fat arrow

我想逐行打印一個數組與回車。

簡單的實現是[1,2,3].forEach(function(x) {console.log(x)})將此作為輸出

1
2
3

現在,如果我使用ES6胖箭的語法糖,

michel$ node
> [1,2,3].forEach(x => console.log(x))
1
2
3
undefined
>
> [1,2,3].forEach(console.log)
1 0 [ 1, 2, 3 ]
2 1 [ 1, 2, 3 ]
3 2 [ 1, 2, 3 ]
undefined

省略forEach回調中的函數參數時,看起來第二個版本正在返回自身的笛卡爾積。

在像Scala這樣的其他函數式語言中,這是完全可以的,為什么JavaScript中的這個“錯誤”呢?

michel$ scala
scala> Array(1,2,3).foreach(x => println(x))
1
2
3

scala> Array(1,2,3).foreach(println)
1
2
3

看來這段代碼在這里:

[1,2,3].forEach(console.log)

是相同的:

[1,2,3].forEach((value, index, array) => console.log(value, index, array))

它不是“錯誤的”,與Scala或Java(方法引用)相比,它只是“不尋常”,它似乎支持使用一個參數的方法引用。 Javascript似乎只是將所有參數復制到引用的方法(例如console.log ),如果此方法支持varargs,則所有內容都會被處理。

但如果您不喜歡這種行為,可以在Javascript中修復它。 創建一個接受一個參數的簡單函數:

function print(t) { console.log(t) }

然后執行:

[1,2,3].forEach(print)

這會打印出結果,如果您來自Scala背景,這將讓您有賓至如歸的感覺:

1
2
3

您可以像這樣使用ES6'胖'箭頭。

     const data = [1,2,3,4]

     data.forEach(item => {
         console.log(item)
     })

forEach將多個參數傳遞給回調,而不只是一個:項目,索引和調用forEach的對象。 console.log大多數實現接受多個參數並輸出所有參數。 這就是為什么forEach(console.log)輸出條目( 1 ),它的索引( 0 )和數組( [ 1, 2, 3 ] ),然后是下一個,等等。

使用箭頭功能,您只使用第一個參數。


附注: forEach(console.log)也傳入console.log不保證this在通話過程中logconsole 有些控制台實現並不關心,有些則不關心。 因此,如果您想要第二種形式,那么使用forEach(console.log, console)可能會更好。

暫無
暫無

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

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