Как стать автором
Обновить

Комментарии 67

А мне нравится идея с only. А то приходилось пару раз писать полную функцию для передачи в map. Я бы, правда, туда ещё контекст вторым аргументом добавил бы.
если есть функция, то если надо с другим контектом вызвать, разве нельзя через only.apply(ctx,1)?
Ну смотрите, если передать так, то всё сломается. У нас используется два this
Function.prototype.only = function(numberOfArgs) {
   var self = this; // первый this
   return function() {
      return self.apply(
         this, // второй this
         [].slice.call(arguments,0,numberOfArgs)
      );
   }
}


Когда мы делаем parseInt.only(1), то первый this равен ссылке на функцию parseInt, а второй зависит от того, как вызовут результат (и скорее всего это будет null, то есть ссылка на window)

Если сделать parseInt.only.apply(ctx, [1])(обратите внимание, что второй аргумент должен быть массивом), то получится так, что первый this — это ctx, а второй — не изменится. А нам надо поменять именно второй для случая, когда мы вызываем метод объекта:

array.map(object.method.only(1, object));

// а only переписать так:
Function.prototype.only = function(numberOfArgs, ctx) {
   var self = this; // первый this
   return function() {
      return self.apply(
         ctx || this, // второй this
         [].slice.call(arguments,0,numberOfArgs)
      );
   }
}

Заметьте — мы подставляем второй this, а не первый!
Понял. Отличное замечание! Я сразу не понял про какой this идет речь.

Эх, какая частая ошибка: забытие замыкания this при вызовах, которые возвращают функцию, использующую первоначальный this…
["1","2","3"].map(Number)

по-моему, круче
Я не понимаю честно, где тут проблема? Надо просто знать как работает фукнция.
Менять из за людей которые не разбираются и не хотят разбираться в том языке на котором пишут что то в языке — как то нелогично.
Ваша фраза интересно смотрится, если представить, что речь идёт о русском языке.
По моему к нему она должна относиться ещё в большей степени.
Предыдущий оратор намекает, что написанное вами на русском языке содержит тонну ошибок. Как и статья, кстати.

А от «Во-1» у меня выпадают глаза.
Я думал, тут принято писать в личку про ошибки)
Если бы тут можно было выделить ошибку, нажать какую-нибудь клавишу и отчёт улетел бы автору, я писал бы так. А выделять, копировать, лезть в личку, там писать и отправлять — это для меня слишком длинный путь.
Я делаю ошибки, но не считаю что нужно менять язык под меня.
Вы делаете их сознательно?
Граммарнаци негодуэ!
Проблема в том, что знания появляются только после того, как наступил на грабли. При хорошей архитектуре количество граблей минимально. Спотыкания новичков свидетельствуют о наличии расставленных граблей = проблемы в архитектуре.
При любой архитектуре найдутся те будет находить в ней грабли.
В JS итак кол — во граблей минимально, если в нем разобраться. А пример выше вообще с большой натяжкой можно назвать граблями.

Вы не правы, есть тонны новичков, которые используют jQuery для аякс запросов и обработки действий, потому как им влом лезть и почитать мануал. Какой шанс что новички будут читать мануалы про only? Будут делать те же ошибки, наступать на грабли и только когда споткнувшись разобьют нос, будут уже что-то думать.
Конечно, проблемы нету. Но пока не перестанет работать — задумываться не будешь)
Всё правильно, всё логично, но не очевидно, имхо.
Ну имхо — очевидно что нельзя доверять вызов функции другой фукнции, не зная точно как она это будет делать. Не очевидно ждать, что функция будет вызвана с 1 аргументом. Ну и совсем уж не очевидно ждать, что функция будет заточена под очень частный случай с числами)
Ну, обычно про эти детали не задумываешь просто по той причине, что редко используешь. Я вот знаю, что parseInt принимает вторым аргументом radix, но вполне мог передать его в map просто по той причине, что обычно не использую второй аргумент и потому могу просто запамятовать.

Другая ситуация — это когда я точно знаю, что функция должна принять только первый аргумент и точно знаю, что если она примет и второй аргумент, она сломается. Приходится делать полную запись:
array.map(function(value) {
    return someCallback(value);
});


И идея с only в данном случае — вполне интересна:
array.map(someCallback.only(1));


И ещё, я не согласен с вами на счёт
Менять из за людей которые не разбираются и не хотят разбираться в том языке на котором пишут что то в языке — как то нелогично.

Javascript постоянно развивается, в него приходят новые идеи. Так в него пришло, например, .bind, а ведь тоже кто-то мог сказать «менять что-то в языке — как-то нелогично».
Идея с only разве не предплагает что я уже помню что map передаёт несколько аргументов? А если я помню то как я попадусь в ловушку?

Развитие это очень хорошо. Но придумывание методов для тех кто не может запомнить поведение 20 — 30 функций и методов JS (что ещё простительно), и не хочет посмотреть в справочник перед примением фукнции, раз уж не помнет — это плохо.

Стоп. Все эти методы рассчитывают на то, что программист помнит эти 20-30 функций.
Если программист не знает об этой особенности, то любые дополнительные методы никак не помогут.
НЛО прилетело и опубликовало эту надпись здесь
Пусть меня заминусуют, опустят карму до «не могу» и нахрен забанят (если тут есть такая возможность) но я наконец-то выскажусь.
Во первых эта статья не относится ну ни как к «родному языку» во вторых… безграмотность не отрицает «любовь к родному языку»
в третьих ВЫ(тут я имею в виду всех «нетословограматных людей») Вы (с полным уважением) запарили, Да именно Вы, те кто нашли в этом сообщении 100500 ошибок как граматических так и (хрен его знает каких еще), ЭТО РЕСУРС ДЛЯ АЙТИШНИКОВ а не для ФИЛОЛОГОВ (или что там за это отвечает)
мне до зуда в жопе обидно, я нехерасебе фронтэнд девелопер и из-за этой хери с «ЛЮБИМЫМ ЯЗЫКОМ» я не могу написать ни одну статью, которая кстати была бы многим интересна. потому что я БЕЗГРАМОТНЫЙ(Вы это, я так понимаю уже заметили)
и на последок…
Ты, да ты, тот придурок который это написал… ты, бля, и палкой нормально ударить не сможешь, так что придержи такие комменты для сайта гото-никрофилов, а не для статьи по JS
Забавный случай, но необходимости в таком растечении мыслью по древу я не вижу.
Ну да, map передает аж три аргумента коллбэку; да, может быть, не самый удачный выбор набора этих аргументов. Да, не хватает встроенного метода для карринга.

Но считать из-за этого JS плохим языком? Увольте.
Но считать из-за этого JS плохим языком? Увольте.

Позвольте узнать, а где вы там видите что-то о том, что JS — плохой язык?
Весь пост пронизан ощущением опасности, исходящей от необязательных аргументов.
Да, потому-что эта опасность — есть. Как, например, есть опасность того, что при помощи Javascript украдут куки, если программист не подумает о защите. Но это не значит, что Javascript — плохой язык.
Но это не значит, что Javascript — плохой язык.

Да, это значит, что есть плохие программисты. С этим я и не спорю.
Какое-то у вас всё чёрно-белое. А никогда в вашем коде не было багов? Или уязвимостей? Уверены, что не допуская XSS? А если бы сайт стал высокопосещаемым, то точно выдержал бы все попытки юных крэкеров?
Отнюдь. И баги, конечно, были.
А защитой от XSS и DDOS занимаются server-side разработчики.

Просто я действительно не вижу проблемы в том, что
["1", "2", "3"].map(parseInt)
не работает так, как, казалось бы, должен на первый взгляд.

Языковые особенности — это клево, но в том, с чем мы работаем, есть гораздо более серьезные проблемы, вы же знаете.
Ну если контент рендерится на клиенте (а такое последнее время встречается всё чаще), то xss стало бы проблемой client-side разработчика)

Согласен. Именно потому про данную особенность необходимо знать. Просто знать, чтобы не попасться не задумываясь.
если контент рендерится на клиенте

Вот тогда я и буду об этом думать.

Я согласен с тем, что надо знать, какие аргументы принимает parseInt.
По мне так тут больше опасности в нетипичной работе map. До этой статьи я верил (начальное изучение JS, к сожалению, выдалось весьма сумбурным, и многие знания базируются на предположениях и фактах, полученных эмпирическим путем), что map в JS работает абсолютно так же, как в Python или Ruby. К счастью эта статья развеяла мои предположения раньше, чем я успел наступить на грабли =)

Хотя к неординарности JS уже привык. Даже в этой статье вылезла еще одна косвенная странность, о которой раньше не знал: долго смотрел на

return self.apply(this,[].slice.call(arguments,0,numberOfArgs))

и не мог понять, что происходит, а потом выяснилось, что объекту arguments не посчастливилось быть полноценным массивом или хотя бы обладать всеми стандартными методами массива, что, на мой взгляд, было бы весьма логичным.
Да, map и arguments имеют несколько странный дизайн, я согласен. Но, видимо, были причины.
[«01»,«02»,«03»,«04»,«05»,«06»,«07»,«08»,«09»,«Всегда ли по умолчанию десятеричная система счисления?»]
.map(function(item, i){return ((i<9)?parseInt(item):item)});

Это кстати гениальная фича. Интересно, чем руководствовались создатели языка, когда делали по умолчанию не 10-ричную систему.
Логикой?)
Обоснуйте. В каких случаях нужно поведение parseInt без второго аргумента?
Ну, лично я редко указываю второй аргумент)
А потом кто-нибудь введет «08» и будете удивляться почему не работает.
А если введёт «0xFF»? Может он хочет воспользоваться другой системой счисления? ;)
У Оливера Стила в библиотеке Functional есть прекрасная функция partial:

['01', '08', '09'].map(parseInt.partial(_, 10)) // [1, 8, 9]
Прикольно)
Нутром чую, что с Underscore.js этой библиотеке так просто не сработаться )
А что толку их обе подключать, если обе предназначены для функционального программирования.
бывает, что другая библиотека подключает в качестве зависимости.
А в ие ведь нет метода map у массива.
Есть:
1. Мутулз
2. Нормальные браузеры
3. Сервер-сайт жс-программирование
Второй пункт сразу отпадает, ибо если что-то делать, так делать до конца, а не только для «нормальных» браузеров, а о третьем пункте да, я как-то не подумал =)
Я балдю! Если человек не читает доки к языку, в частности описание метода map(), которым он собирается воспользоваться, и, что неудивительно, косячит, то это не человек идиот, а язык надо переделать… Причём переделать надо опциональные параметры. Такое впечатление, что будь жёсткое API: parseInt(string, radix, alert_message), а callback(value, index, array), то и проблемы бы не было. Что за идиоты такие статьи пишут?
Каждый видит то, что хочет видеть.
Интересно, что тут можно увидеть кроме того, что люди не то что язык вообще не знают, но даже банально API для них полная загадка? Опциональные параметры есть в большинстве популярных языков: C++, Java, PHP, Ruby, Python и т.д. И, что самое забавное, схожий код даст идентичный результат во всех.

И только великие гуру JavaScript узрели в них непреодолимую проблему бытия. Извините уж, но это полная хуета. Я бы на месте автора этой статьи сгорел бы от стыда.
Немного резко, но в целом я согласен. Проблема высосана из пальца.
["1", "2", "3"].map(parseInt) работает не так как кому-то ожидалось. А ["1", "2", "3"]["0", "1", "2"] работает ещё более непредсказуемо. И что? Если вы пользуетесь методом не зная как он работает, то это не проблема языка — это ваша проблема.
Дык тут дело даже не в знании языка как такового, это же просто посмотреть справочник по api по методу map() и ВСЁ! Тут нет никаких заковырок языка или граблей. Тут нет исключений или неоднозначностей компиляции кода. ЭТО ПРОСТО ТУПО ЗАДОКУМЕНТИРОВАННЫЕ ПАРАМЕТРЫ ФУНКЦИИ!!! Это как вызывать alert() без параметров и удивляться, что нет алерта на экране. Вот я никак не могу понять почему люди такую проблему раздули… Наверное я тупой…
НЛО прилетело и опубликовало эту надпись здесь
Правилом хорошего тона в таком случае будет всегда использовать аннонимную функцию для map.
Ндааа, Хабр уже давно не торт, а торт, как известно, is a lie.
Писать целую статью на Хабре про ОДНУ особенность.
Если честно, ожидал увидеть под катом хоть что-то еще кроме одного нетривиального примера на js.
Это перевод. У них, за границой, такой стиль часто встречается.
Я видел, что перевод. Это меня и огорчает — вместо того, чтобы написать более полноценную собственную статью, народ берётся за переводы уже совсем примитивного.
Ну вообще, лично мне тоже не нравится эта привычка наших заграничных коллег заливать простые статьи водой.
Вы так старательно переводите тему проблемы статей хабра на «зарубежных авторов», что я, пожалуй, закончу диалог ;-)
Я видел, что перевод. Это меня и огорчает — вместо того, чтобы написать более полноценную собственную статью, народ берётся за переводы уже совсем примитивного.
Извините, не туда написалось )
вместо [].slice.call лучше писать Array.prototype.slice.call, чтобы не создавать каждый раз абсолютно ненужный пустой массив
И вдогонку, вместо
[«1»,«2»,«3»].map(function(value) {return parseInt(value)})
лучше написать
[«1»,«2»,«3»].map(Math.floor)
А у меня дофига монстриков наподобие такого:

Function.prototype.partArgs = function(index)
{
   var self = this;

   return function __partArgs() 
   { 
      var args = [];
         
      for(var i = 0, ii = index.length, ix = index; i < ii; ++i)
         args[i] = arguments[ix[i]];
         
      return self.apply(this, args); 
   };
};

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории