2013-07-24 33 views
1

我正在使用NodeJS 0.10.13。我只是好奇,下面的代碼片段的行爲:Array.forEach/.map與path.resolve一起使用時返回錯誤

> 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) 

爲什麼是它的第二和第三map調用返回一個錯誤,當陣列只有字符串?要在的NodeJS的源代碼中的相關行得到這樣的:

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

這是沒有意義的,爲什麼參數不是字符串。有沒有人有任何線索?

回答

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

1

回調到Array.prototype.map會傳遞三個參數:當前元素,索引和正在遍歷的數組。

a.map(path.resolve); 

a.map現在要求path.resolve使用類似這樣的結構:

path.resolve.call(undefined, element, index, array); 

path.resolve([from ...], to)能接受變參。如果你通過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; 
    } 
} 

源在第一次迭代,路徑是第三個參數,它是一個數組。

typeof arrayObject !== 'string'的計算結果爲true並且因此TypeError

相關問題