Автор оригинала: Yazeed Bzadough.
TLDR: Coerce себя использовать тройную равную.
Я непреднамеренно нашел этот JavaScript MeMe на Reddit, и это лучший, который я когда-либо видел.
Вы можете проверить точность этого MEME, запустив каждый фрагмент кода в инструментах разработчиков. Результат не удивительно, но все же разочаровывает.
Конечно, этот маленький эксперимент приведет меня к удивлению …
Почему это происходит?
С опытом работы, я научился принимать гладкие боковые стороны JavaScript во время оружия его колючих сосны. Тем не менее, этот угловой корпус детали все еще убивают меня.
Это так же, как сказал Кайл Симпсон …
” Я не думаю, что кто-то никогда не знает JS, не совсем все равно.
Когда эти случаи появляются, лучше проконсультироваться с источником – Официальный спецификация Ecmascript Этот JavaScript построен из.
С спецификацией в руке давайте глубоко понять, что здесь происходит.
Панель 1 – введение принуждения
Если вы запустите 0 В вашей консоли разработчики почему это возвращает правда ?
0 это число, а "0" Это нить, они никогда не должны быть одинаковыми! Большинство языков программирования уважают это. 0 В Java, например, возвращает это:
error: incomparable types: int and String
Это имеет смысл. Если вы хотите сравнить int и String в Java, вы должны сначала преобразовать их в тот же тип.
Но это JavaScript, вы все!
Когда вы сравниваете два значения через == Один из ценностей может пройти Принуждение Отказ
Принудительно- Автоматически Изменение значения от одного типа на другой.
Автоматически это ключевое слово здесь. Вместо вас Явно Преобразование ваших типов JavaScript делает это для вас за кулисами.
Это удобно, если вы намеренно используете его, но потенциально вредны, если вы не знаете о его последствиях.
Вот официальный Спецификация языка Ecmascript на что. Я перефразирую соответствующую часть:
Если x номер и y – строка, вернуть x (y)
Так что для нашего случая 0 :
С 0 номер и «0» – это строка, возврат 0 («0»)
Наша строка "0" был тайно преобразован в 0 И теперь у нас есть матч!
0 == "0" // true // The second 0 became a number! // so 0 equals 0 is true....
Странно справа? Хорошо привыкнуть к этому, мы даже не сделали на полпути.
Панель 2 – Массивы тоже принуждают
Эта ерунда не ограничивается примитивами, такими как строки, цифры или логики. Вот наше следующее сравнение:
0 == [] // true // What happened...?
Принуждение снова! Я перефразирую соответствующую часть спецификации:
Если x – строка или номер, а y – объект, возврат x (y)
Три вещи здесь:
1. Да, массивы – это объекты
Извините, что сломать тебя.
2. Пустой массив становится пустой строкой
Опять Согласно спецификации JS First ищет объект TOSTRING метод, чтобы принуждать его.
В случае массивов TOSTRING Присоединяется к всему его элементам и возвращает их как строку.
[1, 2, 3].toString() // "1,2,3" ['hello', 'world'].toString() // "hello,world"
С момента нашего массива пусто, нам нечего присоединиться! Следовательно…
[].toString() // ""
Спецификация Отправляющий превращает этот пустой массив в пустую строку. Ссылки находятся здесь и здесь для вашего удобства (или путаницы).
3. Пустая строка затем становится 0
Вы не можете сделать это на веществе. Теперь, когда мы принудили массив на "" Мы вернемся к первому алгоритму …
Если x номер и y – строка, вернуть x (y)
Так для 0.
С 0 номер и «» – это строка, возврат 0 (“”)
Тонобил ("") Возвращает 0.
Следовательно , 0 снова…
Панель 3 – Быстрый Рес
Это правда
0 == "0" // true
Потому что принуждение превращает это в 0 ("0") Отказ
Это правда
0 == [] // true
Потому что принуждение проходит дважды:
Toprimitive ([])дает пустую строку- Тогда
Тонобил ("")дает 0.
Итак, скажите мне … Согласно вышеуказанным правилам, что следует это возвращение?
"0" == []
Панель 4 – false!
ЛОЖНЫЙ! Верный.
Эта часть имеет смысл, если вы поняли правила.
Вот наше сравнение:
"0" == [] // false
ОСНОВНОЕ СМЕРТЕ СПИСОК еще раз:
Если x – строка или номер, а y – объект, возврат x (y)
Это означает…
Поскольку «0» – это строка и [] – это объект, возврат X ([])
Toprimitive ([]) Возвращает пустую строку. Сравнение теперь стало
"0" == ""
"0" и "" оба строки, поэтому JavaScript говорит Не требуется больше принуждений Отказ Вот почему мы получаем ложь Отказ
Заключение
Используйте тройную равную и сон надежно ночью.
0 === "0" // false 0 === [] // false "0" === [] // false
Это позволяет полностью избежать принуждения, поэтому я думаю, что это более эффективно!
Но повышение производительности почти бессмысленно. Настоящая победа – это повышенная уверенность, которую вы будете иметь в своем коде, делая этот дополнительный нажатий на Keystroke.
Хотите бесплатную коучинг?
Если вы хотите запланировать Бесплатно 15-30 минутный призыв Чтобы обсудить вопросы в первом классе, касающиеся кода, интервью, карьеры или чего-либо еще Следуй за мной в Twitter и DM мне Отказ
После этого, если вам наслаждаться нашей первой встречей, мы можем обсудить текущие тренерские отношения, которые помогут вам добраться до ваших целей разработки в области внешнего интерфейса!
Спасибо за прочтение
Для большего количества контента посмотрите https://yazeedb.com!
До скорого!
Оригинал: “https://www.freecodecamp.org/news/explaining-the-best-javascript-meme-i-have-ever-seen/”