Как проверить «не определено» в JavaScript? [Дубликат]

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

2226
задан Peter Mortensen 23 November 2014 в 13:29
поделиться

7 ответов

Если вы хотите узнать, была ли объявлена ​​переменная независимо от ее значения, то наиболее безопасным способом будет использование оператора в . Рассмотрим этот пример.

// global scope
var theFu; // theFu has been declared, but its value is undefined
typeof theFu; // "undefined"

Но в некоторых случаях это может не быть ожидаемым результатом, поскольку переменная или свойство были объявлены, но просто не инициализированы. Используйте оператор в для более надежной проверки.

"theFu" in window; // true
"theFoo" in window; // false

Если вам интересно узнать, не была ли переменная объявлена ​​или имеет значение undefined , используйте оператор typeof .

if (typeof myVar !== 'undefined')

Оператор typeof гарантированно возвращает строку. Прямое сравнение с undefined затруднительно, поскольку undefined может быть перезаписано.

window.undefined = "omg";
"omg" == undefined // true

Как указывает @CMS, это было исправлено в ECMAScript 5-е изд., И undefined не доступен для записи.

if (window.myVar) также будет включать эти ложные значения, поэтому он не очень надежен:

false
0
""
NaN
null
undefined

Спасибо @CMS за указание, что ваш третий случай - if (myVariable) может также вызвать ошибку в двух случаях. Первый - это когда переменная не была определена, что вызывает ошибку ReferenceError .

// abc was never declared.
if (abc) {
    // ReferenceError: abc is not defined
} 

Другой случай - это когда переменная была определена, но имеет функцию получения, которая выдает ошибку при вызове. Например,

// or it's a property that can throw an error
Object.defineProperty(window, "myVariable", { 
    get: function() { throw new Error("W00t?"); }, 
    set: undefined 
});
if (myVariable) {
    // Error: W00t?
}
2560
ответ дан 22 November 2019 в 19:55
поделиться

Если он не определен, он не будет равен строке, содержащей символы «undefined», поскольку строка не является неопределенной.

Вы можете проверить тип переменной:

if (typeof(something) != "undefined") ...

Иногда вам даже не нужно проверять тип. Если значение переменной не может быть оценено как ложное, когда оно установлено (например, если это функция), вы можете просто оценить переменную. Пример:

if (something) {
  something(param);
}
21
ответ дан 22 November 2019 в 19:55
поделиться
if (typeof foo == 'undefined') {
 // Do something
};

Обратите внимание, что строгое сравнение (! == ) не требуется в этом случае, поскольку typeof всегда будет возвращать строку.

17
ответ дан 22 November 2019 в 19:55
поделиться

Вам нужно использовать typeof .

if (typeof something != "undefined") {
    // ...
}
61
ответ дан 22 November 2019 в 19:55
поделиться

Использование typeof - мое предпочтение. Оно будет работать, когда переменная никогда не была объявлена, в отличие от сравнения с помощью операторов == или === или коэрциции типов с помощью if. (undefined, в отличие от null, также может быть переопределено в средах ECMAScript 3, что делает его ненадежным для сравнения, хотя почти все распространенные среды сейчас совместимы с ECMAScript 5 или выше).

if (typeof someUndeclaredVariable == "undefined") {
    // Works
}

if (someUndeclaredVariable === undefined) { 
    // Throws an error
}
176
ответ дан 22 November 2019 в 19:55
поделиться

Я лично использую

myVar === undefined

Предупреждение: обратите внимание, что используется === over == и что myVar был ранее объявлен (не определен ).


Мне не нравится type of myVar === "undefined" . Я думаю, что это длинно и ненужно.(Я могу сделать то же самое с меньшим количеством кода.)

Теперь некоторые люди падают от боли, когда читают это, крича: «Подождите! ПОДОЖДИТЕ !!! undefined можно переопределить!»

Круто. Я знаю это. Опять же, большинство переменных в Javascript можно переопределить. Не следует ли вам никогда не использовать какой-либо встроенный идентификатор, который можно переопределить?

Если вы следуете этому правилу, это хорошо для вас: вы не лицемер.

Дело в том, что для того, чтобы выполнять большую часть реальной работы с JS, разработчикам необходимо полагаться на переопределяемые идентификаторы, чтобы они были такими, какие они есть. Я не слышу, как люди говорят мне, что я не должен использовать setTimeout , потому что кто-то может

window.setTimeout = function () {
    alert("Got you now!");
};

Итог, аргумент «это можно переопределить», чтобы не использовать необработанный === undefined - подделка.

(Если вы все еще боитесь переопределения undefined , почему вы вслепую интегрируете непроверенный код библиотеки в свою базу кода? Или даже проще: инструмент линтинга.)


Также, как и typeof , этот метод может «обнаруживать» необъявленные переменные:

if (window.someVar === undefined) {
    doSomething();
}

Но оба эти метода просачиваются в своей абстракции. Я призываю вас не использовать это или даже

if (typeof myVar !== "undefined") {
    doSomething();
}

. Подумайте:

var iAmUndefined;

Чтобы определить, объявлена ​​ли эта переменная или нет, вам может потребоваться прибегнуть к оператору в . (Во многих случаях можно просто прочитать код О_о).

if ("myVar" in window) {
    doSomething();
}

Но подождите! Есть больше! Что, если происходит какая-то магия цепочки прототипов…? Теперь даже высшего оператора в недостаточно. (Хорошо, я закончил с этой частью, за исключением того, что в 99% случаев === undefined (и **** cough **** typeof ) работает нормально.Если вам действительно интересно, вы можете прочитать об этом самостоятельно.)

1089
ответ дан 22 November 2019 в 19:55
поделиться

Я использую его как параметр функции и исключаю его при выполнении функции таким образом я получаю "настоящий" undefined. Хотя это требует, чтобы вы поместили свой код в функцию. Я обнаружил это при чтении исходного кода jQuery.

undefined = 2;

(function (undefined) {
   console.log(undefined); // prints out undefined
   // and for comparison:
   if (undeclaredvar === undefined) console.log("it works!")
})()

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

0
ответ дан 22 November 2019 в 19:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: