- 1
['10','10','10','10'].map(parseInt)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+127
['10','10','10','10'].map(parseInt)
Результат:
[10, NaN, 2, 3]
blablabla2 22.09.2014 09:48 # +5
// Рассмотрим пример:
['1', '2', '3'].map(parseInt);
// Хотя ожидаемый результат вызова равен [1, 2, 3],
// в действительности получаем [1, NaN, NaN]
// Функция parseInt часто используется с одним аргументом, но она принимает два.
// Первый аргумент является выражением, а второй - основанием системы счисления.
// В функцию callback Array.prototype.map передаёт 3 аргумента:
// элемент, его индекс и сам массив.
// Третий аргумент игнорируется parseInt, но не второй, следовательно,
// возможна путаница. Смотрите запись в блоге для дополнительной информации.
function returnInt(element) {
return parseInt(element, 10);
}
['1', '2', '3'].map(returnInt);
// Результатом является массив чисел (как и ожидалось)
// Простейший способ добиться вышеозначенного поведения и избежать чувства "чё за!?":
['1', '2', '3'].map(Number); // [1, 2, 3]
someone 22.09.2014 10:29 # +3
Вот видите, не доводит до добра ваша непонятная функциональщина.
roman-kashitsyn 22.09.2014 10:34 # +7
В хачкеле таких проблем нет.
inkanus-gray 22.09.2014 10:48 # 0
wvxvw 22.09.2014 20:38 # +4
Во-первых: а зачем такой дизайн у стандартных функций? Мне вот за всю жизнь ни разу не пригодились эти дополнительные параметры, только крови попортили.
Во-вторых: фреймвокри существуют, но всилу ограниченности авторов фреймворков, обычно там дизайн такой же херовый. В подчерке, ж.квери, прототипе и т.п. вечно сделано через жопу. Гораздо логичнее было бы:
1. Не делать эти функции методами объектов (если уж это метод, то за каким туда передается this еще раз, третим параметром?). Таким образом их можно будет вменяемо компоновать.
2. Коллекции, по которым можно применять map / filter / reduce должны имплементить какой-нибудь итератор или другой механизм, который бы сделал map / filter / reduce расширяемыми для новых коллекций.
3. Передавать функцию работающую с элементами коллекции первым аргументом и потом одну или больше коллекций. Это позволяет обрабатывать табличные данные легко, например, да и вообще есть много полезных вариантов использования.
someone 22.09.2014 10:50 # +1
kegdan 22.09.2014 11:09 # +1
inkanus-gray 22.09.2014 11:57 # 0
inkanus-gray 22.09.2014 10:54 # +2
['10','10','10','10'].map(function(x){return parseInt(x)})
inkanus-gray 22.09.2014 10:46 # +3
kegdan 22.09.2014 11:10 # 0
inkanus-gray 22.09.2014 15:44 # +1
3.14159265 22.09.2014 16:46 # +1
>["[object Undefined]", "[object Undefined]", "[object Undefined]"]
['1', '2', '3'].map(String);
["1", "2", "3"]
1024-- 22.09.2014 17:12 # +2
1024-- 22.09.2014 17:21 # 0
3.14159265 22.09.2014 18:46 # 0
['1', '2', '3'].map(valueOf);
[DOMWindow, DOMWindow, DOMWindow]
['1', '2', '3'].map(hasOwnProperty);
[false, false, false]
7-й хром.
>В Firefox toString() и window.toString() даёт разные результаты
У меня одинаковые.
inkanus-gray 22.09.2014 21:25 # 0
3.14159265 23.09.2014 00:56 # 0
>Cannot convert undefined or null to Object
3.14159265 22.09.2014 18:54 # 0
>Видимо, в хроме кто-то решил оптимизировать window.toString.
Это не оптимизация, это регрессия.
1024-- 22.09.2014 18:55 # 0
Chromium 37.0.2048.0 (прошу прощения, то был не совсем Chrome)
Firefox 32.0.2
zloirock 27.09.2014 15:20 # 0
1024-- 27.09.2014 15:42 # 0
Лисье "[object Undefined]" вместе с исключением по valueOf() логично и объяснимо. А хромое "[object Window]" вместе с исключением по valueOf() - бред какой-то.
zloirock 27.09.2014 15:49 # 0
1024-- 27.09.2014 15:53 # 0
kegdan 27.09.2014 16:28 # 0
bormand 27.09.2014 16:29 # +1
guest 27.09.2014 22:58 # −4
1024-- 22.09.2014 11:52 # 0
(позже участок кода, уже исправленный, был отправлен в http://govnokod.ru/16651 из-за более тонкой ошибки)