Я всегда поддерживал практику проверки того, является ли значение неопределенным, используя
if (typeof x === 'undefined')
Однако коллега предполагает, что лучше использовать if (x) {.
Есть ли разница между этими двумя методами с вычислительной точки зрения?
Вы должны просмотреть этот пост: stackoverflow.com/questions/6604749/… содержит подробные ответы с преимуществами undefined
@jtwalters это не имеет значения
В зависимости от контекста для параметров я обычно использую x == null, чтобы охватить как вариант использования null, так и undefined. Он обеспечивает логический вывод, а его кросс-язык более нагляден и удобочитаем.
Как заметил @SebastianSimon, вы никогда не должны использовать typeof x === 'undefined'. x === undefined, однако, это хорошая и конкретная проверка, когда вам не нужна общая фальшь.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


На мой взгляд, есть как минимум два отличия:
if (x), который проверяет любые истинные значения (например, true, непустую строку, ненулевое число и т. д.)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), когда...
0if (string.length))null, когда нет результата для запроса или объекта, когда он есть (функции DOM, такие как document.getElementById, возвращают null, когда элемент с таким идентификатором не существует))Используйте if (typeof x !== "undefined"), когда...
if (typeof obj.key !== "undefined")) (правильный способ, как указал комментатор, с Object.hasOwn(obj, "ключ"))Еще один важный вариант использования if (x) — проверка существования объекта. Многие функции возвращают либо объект, либо null (или либо объект, либо undefined). Особенно элементы HTML. Принадлежность ключей следует проверять с помощью Object.hasOwn(obj, "key"), а не с помощью in. Вариант использования аргументов действительно очень полезен.
@SebastianSimon хорошо, я сделаю обновления.
Привет @code - я просто хотел отметить, что, похоже, работает следующее: let obj = {test1: "test1", test2: "test2"}; if (!obj.test3) { console.info('nice'); } Есть ли случаи, когда это может не сработать?
@OliverKucharzewski if (x) проверяет ложные значения. undefined также является значением falsy, поэтому, хотя оно не будет выполняться, когда что-то не определено, оно не будет выполняться и при значении false, "" или null. obj.test3 есть undefined, что приводит к ложному. Когда вы перевернете это, это будет правдой. if увидит true, поэтому и выполняется. Надеюсь, это имеет смысл?
Это совершенно справедливо, спасибо @code :)
Полезно иметь в виду, что 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.
0, -0, NaN"")Как уже ответили другие, приложения спецификации поступают в нескольких разных местах. Причины существования typeof и совпадения с ложной оценкой связаны с тем, как движки JS обрабатывают значения и выполняют преобразование в логическое значение.
Они не эквивалентны (а также не инверсны друг другу).
if (x)проверяет правдивые значения; другой проверяетundefined, в частности. Но тогдаif (x === undefined)проще.