Есть ли разница между typeof x === 'undefined' и if (x)

Я всегда поддерживал практику проверки того, является ли значение неопределенным, используя

if (typeof x === 'undefined')

Однако коллега предполагает, что лучше использовать if (x) {.

Есть ли разница между этими двумя методами с вычислительной точки зрения?

Они не эквивалентны (а также не инверсны друг другу). if (x) проверяет правдивые значения; другой проверяет undefined, в частности. Но тогда if (x === undefined) проще.

Sebastian Simon 17.11.2022 02:37

Вы должны просмотреть этот пост: stackoverflow.com/questions/6604749/… содержит подробные ответы с преимуществами undefined

jtwalters 17.11.2022 02:41

@jtwalters это не имеет значения

zerkms 17.11.2022 02:41

В зависимости от контекста для параметров я обычно использую x == null, чтобы охватить как вариант использования null, так и undefined. Он обеспечивает логический вывод, а его кросс-язык более нагляден и удобочитаем.

Jens Ingels 17.11.2022 03:08

Как заметил @SebastianSimon, вы никогда не должны использовать typeof x === 'undefined'. x === undefined, однако, это хорошая и конкретная проверка, когда вам не нужна общая фальшь.

Ry- 17.11.2022 03:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
94
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

На мой взгляд, есть как минимум два отличия:

  1. Проверка типа как неопределенного проверяет только неопределенность, в отличие от if (x), который проверяет любые истинные значения (например, true, непустую строку, ненулевое число и т. д.)
  2. Вы можете выполнять typeof с несуществующими переменными даже в строгом режиме. Вы получите справочную ошибку, если никогда не объявляли x и делали if (x)

"use strict";

const a = undefined;
const b = "truthy value";

if (a) {
  console.info("a in if"); // never executes
}
if (typeof a !== "undefined") {
  console.info("a with typeof"); // never executes
}

if (b) {
  console.info("b in if"); // executes
}
if (typeof b === "undefined") {
  console.info("b with typeof"); // never executes
}


try {
  if (c) console.info("this should error");
} catch(e) {
  console.info("Can't access non-existent variable");
}

console.info("No error:", typeof c);

Когда я должен использовать какой?

Вообще:
Используйте if (x), когда...

  • Вы проверяете логическое значение
  • Вы проверяете на (нет) 0
  • Вы проверяете непустую пустую строку (возможно, вместо этого используйте if (string.length))
  • Проверка возвращаемого значения функции (например, функция возвращает null, когда нет результата для запроса или объекта, когда он есть (функции DOM, такие как document.getElementById, возвращают null, когда элемент с таким идентификатором не существует))

Используйте if (typeof x !== "undefined"), когда...

  • Вы проверяете, существует ли ключ объекта (if (typeof obj.key !== "undefined")) (правильный способ, как указал комментатор, с Object.hasOwn(obj, "ключ"))
  • Вы проверяете, существует ли переменная (хотя не уверен, когда и почему вы это сделаете)
  • Проверка того, был ли передан аргумент
  • Другое использование, например, когда вы пишете сервер Express и проверяете пользовательский контент.
  • Что-то еще, наверное, забыл...

Еще один важный вариант использования if (x) — проверка существования объекта. Многие функции возвращают либо объект, либо null (или либо объект, либо undefined). Особенно элементы HTML. Принадлежность ключей следует проверять с помощью Object.hasOwn(obj, "key"), а не с помощью in. Вариант использования аргументов действительно очень полезен.

Sebastian Simon 17.11.2022 03:06

@SebastianSimon хорошо, я сделаю обновления.

code 17.11.2022 03:12

Привет @code - я просто хотел отметить, что, похоже, работает следующее: let obj = {test1: "test1", test2: "test2"}; if (!obj.test3) { console.info('nice'); } Есть ли случаи, когда это может не сработать?

Oliver Kucharzewski 17.11.2022 03:37

@OliverKucharzewski if (x) проверяет ложные значения. undefined также является значением falsy, поэтому, хотя оно не будет выполняться, когда что-то не определено, оно не будет выполняться и при значении false, "" или null. obj.test3 есть undefined, что приводит к ложному. Когда вы перевернете это, это будет правдой. if увидит true, поэтому и выполняется. Надеюсь, это имеет смысл?

code 17.11.2022 03:42

Это совершенно справедливо, спасибо @code :)

Oliver Kucharzewski 17.11.2022 03:46

Полезно иметь в виду, что Javascript динамически типизируется, даже если он выглядит как просто переменные. В JS есть несколько типов, и Undefined (с заглавными буквами) — один, и единственное значение, которое он может содержать, — это undefined. Подумайте об этом, как если бы вы сказали, что у вас есть тип Number, и он принимает только 42. Это важно знать, потому что движки JS должны соблюдать спецификацию.

Тип Undefined имеет ровно одно значение, называемое undefined. Любая переменная, которой не присвоено значение, имеет значение undefined.

В коде приложения много вариаций, но вы можете знать, что переменные, которые не были назначены, имеют тип Undefined со значением undefined, а не что-то еще. Рядом с Undefined стоит Null, который имеет единственное значение, null. Null, в отличие от Undefined, необходимо присваивать.

В спецификации вы также найдете таблицу результатов, которые вы получаете для каждого типа переменной.

Вы заметите, что Undefined имеет свое собственное возвращаемое значение, а также логическое значение, но Null возвращает «объект», который, как сообщается, является ошибкой в ​​исходной спецификации, от которой мы не можем избавиться.

Избавившись от типов, мы подошли к логическому приведению, то есть к тому, как операторы if обрабатывают условие. В спецификации есть таблица случаев, которые определяют, когда значение должно быть приведено к истинному или ложному.

Вы увидите, что предложение if получает тип Undefined и возвращает false. То же самое происходит с Null. Есть несколько других случаев, которые также могут возвращать false, даже если они не являются Undefined или Null.

  1. Тип Number со значениями 0, -0, NaN
  2. Тип String с длиной 0 ("")
  3. Тип BigInt со значением 0

Как уже ответили другие, приложения спецификации поступают в нескольких разных местах. Причины существования typeof и совпадения с ложной оценкой связаны с тем, как движки JS обрабатывают значения и выполняют преобразование в логическое значение.

Другие вопросы по теме