Nodejs:collection.forEach(console.log)的行为与collection.forEach(function(x){console.log(x)})不同,为什么?

时间:2014-12-14 03:28:31

标签: javascript node.js foreach

具体来说,这段代码:

fs = require('fs')
path = require('path')
var filePath = process.argv[2]
var ext = "." + process.argv[3]
fs.readdir(filePath, function(err, files) {
  var results = files.filter(function(file) { return path.extname(file) === ext })
  results.forEach(function(result) { console.log(result) })
})

输出:

CHANGELOG.md

LICENCE.md

README.md

vs此代码:

fs = require('fs')
path = require('path')
var filePath = process.argv[2]
var ext = "." + process.argv[3]
fs.readdir(filePath, function(err, files) {
  var results = files.filter(function(file) { return path.extname(file) === ext })
  results.forEach(console.log)
})

输出:

CHANGELOG.md 0 [ 'CHANGELOG.md', 'LICENCE.md', 'README.md' ] 

LICENCE.md 1 [ 'CHANGELOG.md', 'LICENCE.md', 'README.md' ]

README.md 2 [ 'CHANGELOG.md', 'LICENCE.md', 'README.md' ]

我的理解是,在这种情况下,两种调用forEach的样式都应该打印相同的结果。为什么行为不同?谢谢!

2 个答案:

答案 0 :(得分:4)

Array.prototype.forEach传递多个参数。大多数时间,人们只使用第一个,这是个别元素,但其他人都在那里。

所以results.forEach(console.log)就像

results.forEach(function(element, index, elements) {
    console.log(element, index, elements);
});

并且(在NodeJS中)console.log使用可变数量的参数。它打印由空格分隔的参数。

所以你得到了每一行的元素,索引和所有元素。


仅供参考,写results.forEach(console.log)因其他原因而异常。它会导致使用全局上下文调用.log对于Node,它可以正常工作,但如果您在Chrome中尝试[1,2,3].forEach(console.log),则会出现“TypeError” :非法援引“。 “课程并不意味着你无法做到;只是对于很多JS程序员来说这看起来很奇怪。

答案 1 :(得分:2)

array.forEach()将多个参数传递给您传入的回调:当前值,array中当前值的索引以及array本身。 console.log接受任意数量的参数并在同一行上打印每个参数,每个参数用空格分隔。