与path.resolve一起使用时,Array.forEach / .map返回错误
我正在使用NodeJS 0.10.13。 我只是好奇以下代码片段的行为:
> var a = ['1','2','3'] undefined > a.map(function(){return path.resolve(arguments[0])}) [ '/Users/user/1', '/Users/user/2', '/Users/user/3' ] > a.map(path.resolve) TypeError: Arguments to path.resolve must be strings at exports.resolve (path.js:313:15) > a.map(path.resolve.bind(path))) TypeError: Arguments to path.resolve must be strings at exports.resolve (path.js:313:15)
为什么当数组只有string时,第二和第三个map
调用会返回一个错误? 去NodeJS源代码中的相关行产生这样的结果:
if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings'); } else if (!path) { continue; }
对于为什么参数不是string,这是没有意义的。 有没有人有任何线索?
发生这种情况的原因是传递给映射函数的每个调用的参数不仅会得到实际的元素,还会得到数组索引和整个数组。
要准确查看发送到map
参数,请尝试以下操作:
> var a = ['1', '2', '3']; ['1', '2', '3'] > a.map(function() { return arguments}); [ { '0': '1', '1': 0, '2': [ '1', '2', '3' ] }, { '0': '2', '1': 1, '2': [ '1', '2', '3' ] }, { '0': '3', '1': 2, '2': [ '1', '2', '3' ] } ]
由于发送给映射函数的对象(本例中为path.resolve
)不是一个string,而是一个对象,所以会得到一个TypeError
。
对Array.prototype.map
的callback传递三个参数:当前元素,索引和被遍历的数组。
a.map(path.resolve);
a.map现在使用类似于以下的构造来调用path.resolve:
path.resolve.call(undefined, element, index, array);
path.resolve([from ...], to)
可以接受var args。 如果你通过path.js的源代码
for (var i = arguments.length - 1; i >= -1; i--) { //..irrelevant lines var path = arguments[i]; if (typeof path !== 'string') { throw new TypeError('Arguments to path.resolve must be strings');} else if (!path) { continue; } }
在第一次迭代中,path是第三个参数,它是一个Array。
typeof arrayObject !== 'string'
计算结果为true
,因此TypeError