具体来说,这段代码:
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的样式都应该打印相同的结果。为什么行为不同?谢谢!
答案 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
接受任意数量的参数并在同一行上打印每个参数,每个参数用空格分隔。