2017-02-08 2 views
1

В чем разница между map(func) и map(function(x) { return func(x); })?Поведение странной карты

Рассмотрим следующий пример:

const lines = '1\n2\n3'; 
 
const result = lines.split('\n').map(parseInt); 
 
console.log(result)

Это возвращает [1, NaN, NaN], который не то, что я ожидал. Однако:

const lines = '1\n2\n3'; 
 
const result = lines.split('\n').map(function(x){ return parseInt(x)}); 
 
console.log(result)

возвращает ожидаемый: [1, 2, 3]. В чем разница между этими двумя формами и почему в первом примере результат не [1, 2, 3]?

ответ

3

parseInt имеет второй параметр (radix).

В основном вы выполняете эту

value index parseInt comment 
----- ----- -------- ----------------------------------------------------- 
    '1'  0  1 with radix 0, and value 1 parseInt assumes radix = 10 
    '2'  1  NaN because of the wrong value for the radix 
    '3'  2  NaN because of the wrong value for the radix 

Для преобразования в число, вы можете использовать Number.

var lines = '1\n2\n3' 
 

 
console.log(lines.split('\n').map(Number));

Для получения целочисленных значений, можно использовать Math.floor, а также.

var lines = '1\n2\n3' 
 

 
console.log(lines.split('\n').map(Math.floor));

+0

Почему это downvoted? –

2

Разница заключается в том, что .map переходит к его параметрам функции 3:

.map(element, index, array) 

когда функция parseInt принимает 2 аргумента

parseInt(string, radix) 

Итак, вы проходите индекс как радиус. Вот почему ваш результат неправильный. Если parseInt принимал только один аргумент, это сработало бы.

2

Поскольку индекс с карты будут переданы в функцию карты

let lines = '1\n2\n3' 
let a = lines.split('\n').map(parseInt); 
console.log(a) 

// Your code above is expanded as below 
a = lines.split('\n').map((x, i) => { 
    return parseInt(x, i) 
}) 

console.log(a) 

// To fix it, use this 
lines.split('\n').map(x => parseInt(x)); 
Смежные вопросы