- 1
['10','10','10','10'].map(parseInt)
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+127
['10','10','10','10'].map(parseInt)
Результат:
[10, NaN, 2, 3]
// Рассмотрим пример:
['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]
Вот видите, не доводит до добра ваша непонятная функциональщина.
В хачкеле таких проблем нет.
Во-первых: а зачем такой дизайн у стандартных функций? Мне вот за всю жизнь ни разу не пригодились эти дополнительные параметры, только крови попортили.
Во-вторых: фреймвокри существуют, но всилу ограниченности авторов фреймворков, обычно там дизайн такой же херовый. В подчерке, ж.квери, прототипе и т.п. вечно сделано через жопу. Гораздо логичнее было бы:
1. Не делать эти функции методами объектов (если уж это метод, то за каким туда передается this еще раз, третим параметром?). Таким образом их можно будет вменяемо компоновать.
2. Коллекции, по которым можно применять map / filter / reduce должны имплементить какой-нибудь итератор или другой механизм, который бы сделал map / filter / reduce расширяемыми для новых коллекций.
3. Передавать функцию работающую с элементами коллекции первым аргументом и потом одну или больше коллекций. Это позволяет обрабатывать табличные данные легко, например, да и вообще есть много полезных вариантов использования.
['10','10','10','10'].map(function(x){return parseInt(x)})
>["[object Undefined]", "[object Undefined]", "[object Undefined]"]
['1', '2', '3'].map(String);
["1", "2", "3"]
['1', '2', '3'].map(valueOf);
[DOMWindow, DOMWindow, DOMWindow]
['1', '2', '3'].map(hasOwnProperty);
[false, false, false]
7-й хром.
>В Firefox toString() и window.toString() даёт разные результаты
У меня одинаковые.
>Cannot convert undefined or null to Object
>Видимо, в хроме кто-то решил оптимизировать window.toString.
Это не оптимизация, это регрессия.
Chromium 37.0.2048.0 (прошу прощения, то был не совсем Chrome)
Firefox 32.0.2
Лисье "[object Undefined]" вместе с исключением по valueOf() логично и объяснимо. А хромое "[object Window]" вместе с исключением по valueOf() - бред какой-то.
(позже участок кода, уже исправленный, был отправлен в http://govnokod.ru/16651 из-за более тонкой ошибки)