2013-07-24 3 views
1

NodeJS 0.10.13을 사용하고 있습니다. 배열은 문자열이있는 경우 2 층과 3 map 호출이 오류를 반환하는 것이Path.resolve와 함께 사용하면 Array.forEach/.map 반환 오류가 발생합니다.

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

이유는 : 나는 다음과 같은 코드의 행동에 대해 그냥 궁금 해요? NodeJS의 소스 코드의 해당 라인에가는 것은이 산출 :

인수가 문자열이 아닌 이유에 대한 이해되지 않는다
if (typeof path !== 'string') { 
    throw new TypeError('Arguments to path.resolve must be strings'); 
} else if (!path) { 
    continue; 
} 

. 아무도 단서가 있습니까?

답변

0

매핑 된 함수의 각 호출에 전달 된 매개 변수는 실제 elment뿐만 아니라 배열 인덱스와 전체 배열을 가져 오기 때문에 이러한 상황이 발생합니다.

매개 변수가 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)는 VAR의 인수를 받아 들일 수 있습니다. 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

평가
관련 문제