1

我正在使用 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)

当数组只有字符串时,为什么第 2 次和第 3 次map调用会返回错误?转到 NodeJS 源代码中的相关行会产生以下结果:

if (typeof path !== 'string') {
    throw new TypeError('Arguments to path.resolve must be strings');
} else if (!path) {
    continue;
}

这对于为什么参数不是字符串没有意义。有没有人有任何线索?

4

2 回答 2

1

回调Array.prototype.map传递三个参数:当前元素、索引和被遍历的数组。

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 是第三个参数,它是一个数组。

typeof arrayObject !== 'string'评估为true,因此TypeError

于 2013-07-24T07:31:46.217 回答
0

发生这种情况是因为传递给映射函数的每次调用的参数不仅会获得实际的元素,还会获得数组索引和整个数组。

要准确查看发送到的参数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在本例中)不是字符串而是对象,因此您会得到一个TypeError.

于 2013-07-24T07:31:36.073 回答