2016-02-03 4 views
2

Когда я выполняю следующие утверждения:JavaScript: радикс тайна ParseInt с Array.map

var string = "1 1 1 1 1 1 0 1 1" 
console.log(string) 
var strings = string.split(" ") 
console.log(strings) 
var numbers1 = strings.map(parseInt) 
console.log(numbers1) 
var numbers2 = strings.map(function(i){ return parseInt(i, 10) }) 
console.log(numbers2) 

Я получаю следующий вывод в консоли:

1 1 1 1 1 1 0 1 1 
["1", "1", "1", "1", "1", "1", "0", "1", "1"] 
[1, NaN, 1, 1, 1, 1, 0, 1, 1] 
[1, 1, 1, 1, 1, 1, 0, 1, 1] 

Интересно, почему второй элемент в numbers1 NaN. Почему он работает над всеми другими элементами, кроме этого?

ответ

7

Это потому, что map передает дополнительные аргументы.

Array.prototype.map = function(currentValue, index, array) 

Так что, когда он находится в индексе 1, он проходит 1 как основание.

3

Array.prototype.map имеет три аргумента, которые проходят в обратный вызов мы устанавливаем в качестве аргумента:

* value 
* index 
* arr 

Когда мы проверяем спецификации parseInt мы можем видеть, что ParseInt может получить два аргумента.

* string 
* radix 

Первый - это строка, подлежащая анализу, и последняя является отношением для преобразования значения.

При запуске Snippet 1 код, следующий на самом деле

> ParseInt ("1", 0) // 1

> ParseInt ("1", 1) // NaN

> ParseInt ("1", 2) // 1

> ParseInt ("1", 3) // 1


Вы можете использовать Arrow function с parseInt

array.map(e => parseInt(e, 10)); 

Использование Number вместо parseInt.

arr.map(Number); 

Или вы также можете использовать анонимную функцию.

arr.map(function(num) { 
    return parseInt(num, 10); 
}); 
Смежные вопросы