В JS вы можете вернуть логическое значение, имеющее пользовательские свойства. Например. когда Modernizr проверяет поддержку видео, он возвращает true
или, false
но возвращенное логическое значение (Bool является объектом первого класса в JS), имеет свойства, определяющие, какие форматы поддерживаются. Сначала это меня немного удивило, но потом мне стала нравиться эта идея, и я удивился, почему она используется довольно редко?
Это выглядит как элегантный способ справиться со всеми этими сценариями, где вы в основном хотите знать, является ли что-то истинным или ложным, но вас может заинтересовать некоторая дополнительная информация, которую вы можете определить, не определяя пользовательский объект возврата или используя функцию обратного вызова, подготовленную для принять больше параметров. Таким образом, вы сохраняете очень универсальную сигнатуру функции без ущерба для возможности возврата более сложных данных.
Против этого есть три аргумента:
- Это немного необычно / неожиданно, когда лучше, чтобы любой интерфейс был понятным и не хитрым.
- Это может быть аргумент соломенного чучела, но, учитывая, что он является чем-то вроде крайнего случая, я могу себе представить, что в некоторых оптимизаторах JS, uglifier, VM или после незначительной смены спецификаций языка очистки и т. Д. Это может иметь неприятные последствия.
- Есть лучший - краткий, ясный и общий - способ сделать то же самое.
Итак, мой вопрос: есть ли веские причины избегать использования логических значений с дополнительными свойствами? Это трюк или удовольствие?
Участок крутит предупреждение.
Выше оригинальный вопрос в полной славе. Как указали Мэтью Крамли и Сеневольдсен, это основано на ложной (ложной?) Предпосылке. В традициях JS, что делает Modernizr, это языковой трюк и грязный. Это сводится к тому, что JS имеет примитив bool, который, если он установлен в false, останется ложным даже после того, как TRYING добавит реквизит (который завершается с ошибкой) и логический объект, который может иметь пользовательские реквизиты, но быть объектом всегда правдив. Modernizr возвращает либо логическое ложное значение, либо истинный логический объект.
Мой оригинальный вопрос предполагал, что уловка работает по-другому, и поэтому наиболее популярные ответы касаются (совершенно правильного) аспекта стандартов кодирования. Однако я считаю, что ответы, опровергающие весь трюк, наиболее полезны (а также основные аргументы против использования метода), поэтому я принимаю один из них. Спасибо всем участникам!
null
если не поддерживается, и массив форматов, если это так. Список считается правдивым в JS и null
является ложным.