Comments 42
(function () {
console.log('Normal IIFE called')
})()
и(function () {
console.log('Not normal IIFE called')
}())
www.youtube.com/watch?v=eGArABpLy0k&t=1m10s
Так то, можно даже так
!function () {
console.log('Normal IIFE called')
}();
+function () {
console.log('Normal IIFE called')
}();
~function () {
console.log('Normal IIFE called')
}();
Главное, чтобы JS понял, что это выражение а не конструкция. Для этого и применяются скобки, операторы. Например вот это блок/конструкция
{}
а вот это уже будет объект
({})
Двойной восклицательный знак
Он редко когда может пригодится в JS, т.к. в условиях и так идет преобразование в булевой тип. Возможно, только когда нужно явно передать булевое значение, например в JSON, или в переменную is*. Но странно, что вы его засунули в статью малоизвестных возможностей.
Побитовые операторы нужно использовать по предназначению. Такие вот штуки
if (~username.indexOf("Drake")) {
console.log('Access denied')
}
очень сильно усложняют код. Это неявно, а неявное — плохо.
Оператор «запятая»
Тоже забудьте в продакшине. Неопытных разработчик не сразу скажет, чему тут будет равно а
var a = (10 * 3,
20 * 4,
10 * 2)
Неявная штукенция, в 99% случаев подходит лишь, когда стоит цель, написать минимум символов. Все равно минификатором все будет сжато.
Все эти штуки из статьи, описываются почти в любом учебнике по JS. Думал будет что-то реально малоизвестное. Вы же вроде хотели доперевести You Dont Know JS, там реально полезный материал.
Тоже забудьте в продакшине.
В трансдьюсерах это позволяет обойтись без; и return
Неопытных разработчик не сразу скажет, чему тут будет равно а
Вы так думаете? Мне казалось, что семантика запятой достаточно проста.
Не согласен. Конструкция ~array.indexOf(x) // array.includes(x) легко запоминается и потом читается лучше чем != -1. Или там > -1? или >= 0?
PS. На самом деле не хрень, но обычно люди не считывают практики из соседних участков кода, а пытаются делать как их учили (или как считают правильным). Оно работает, но артефактно для проекта и часто приходится голову ломать как же такое зарефакторить, чтобы не переделывать с нуля. Так что пусть читают, что написано у меня и включают мозг.
Если питонист заглянет в мой код, предпочитаю, чтобы он знал JS, а то когда я отпуске, питонисты и джависты всякую хрень пишут
Я часто заглядываю в бек, не для того, чтобы что написать, а чтобы лучше понимать, как работать с нужным методом, и что от него ожидать. В реальном мире не весь код хорошо документируется, и часто быстрее прочитать чужой код, чем спрашивать у автора. Но конечно, нет проблем загуглить.
Кроме того, я всегда подробно обсуждаю интерфейсы и возможные кейсы использования с бэкерами (равно как, будучи бэком, обсуждал интерфейсы с фронтами). Но согласен, что может быть код, от которого не осталось разработчиков. И тогда его придётся читать (но не боже мой мне указывать какие идиомы (не)использовать коллегам, да и спросить я не постесняюсь, если не нагуглю).
Впрочем, примерно на эту тему у меня две статьи для хабра в работе. Там можно будет и поспорить в комментариях) Ближайшей надо примерно 8-10 поездок на метро, когда удаётся сесть)
this.is_found = _.find(list, {id})
то лучше запись
this.is_found = !!_.find(list, {id})
она страшноватая, но не засоряет структуру
2. Обожаю ~. Первый раз когда увидел его прифигел, когда прочитал по нему доку, прифегел второй раз: «оказывается вот так можно!». На порядок лучше, чем
a.indexOf(...) >= 0
Просто потому, что можно забыть поставить = и потом долго «хохотать» при поиске ошибки. Если ко мне придёт падаван с вопросом, а что это ~ в коде, то я буду сильно разочарован в человеке не способном воспользоваться один раз гуглом.
3. Не использовал, потому что не знал. Теперь знаю, но в продакшене использовать не планирую, но ребята выше говорят, что это вполне юзабельно в определённом контексте. Вне контекста хороший способ выстрелить в ногу, тут согласен.
В девелопе пригодится, буду юзать для отладки стрелок, оно поизящнее того изврата, что использую обычно:
list.filter(x => console.log(x) || <condition>) // это изврат, да?
list.filter(x => console.log(x) , <condition>) // а так прикольнее
list.filter(x => x.id === 42 && console.log(x) , <condition>) // а тут можно и условие замутить и даже тернарник
По первому, я так и написал
или в переменную is*
Под is* имелся ввиду шаблон названия гетера, например isActive, isFound и.т.д.
Если я ничего не путаю суть в том, что необходимо было исполнять функции из некоего набора API и не дать вызвать какие-то другие методы из цепочки прототипов, то есть сделать песочницу. Так вот докладчик использовал для этого связку with + Proxy и это магическим образом и парой костылей (вернее сказать затычек) превратилось в абсолютно изолированную среду. Магия, не иначе!
Очень даже дергает. Главное — не забывать про то, что, в соответствии с пунктом 8.1.2.1 спецификации, сначала дергается has, а потом уже все остальное.
'use strict';
Function`console.log(arguments.callee)```;
Вместо callee
можно использовать this.name
, например. Конечно, this
должно быть равно функции в этом случае.
'use strict';
(new Function('console.log(this)'))();
Ну разумеется, если Вы вызываете его из глобального окружения. В данном случае нужно явно передать контекст:
const f = new Function('console.log(this.name)')
f.call(f) // anonymous
const AAA = function () {console.log(this.name)}
AAA.call(AAA) // AAA
Конечно, this должно быть равно функции в этом случае.
Именно это подразумевало.
with
давно устарел и не рекомендуется к использованию.
void 0
используется по сей день в большей части в минификаторах, так как занимает меньше места.
про +
тема не раскрыта. Магия не в том, что +
способен "даже moment.js превращать в число", а в том, что он использует valueOf
метод, который можно переопределить (ну и делает конверсию, конечно).
Малоизвестные возможности JavaScript