Почему бы не использовать CGI для этой цели, CGI фактически запускает исполняемый файл через браузер на сервере.
Если вы хотите узнать, была ли объявлена переменная независимо от ее значения, то наиболее безопасным способом будет использование оператора в
. Рассмотрим этот пример.
// 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?
}
Если он не определен, он не будет равен строке, содержащей символы «undefined», поскольку строка не является неопределенной.
Вы можете проверить тип переменной:
if (typeof(something) != "undefined") ...
Иногда вам даже не нужно проверять тип. Если значение переменной не может быть оценено как ложное, когда оно установлено (например, если это функция), вы можете просто оценить переменную. Пример:
if (something) {
something(param);
}
if (typeof foo == 'undefined') {
// Do something
};
Обратите внимание, что строгое сравнение (! ==
) не требуется в этом случае, поскольку typeof
всегда будет возвращать строку.
Вам нужно использовать typeof
.
if (typeof something != "undefined") {
// ...
}
Использование typeof
- мое предпочтение. Оно будет работать, когда переменная никогда не была объявлена, в отличие от сравнения с помощью операторов ==
или ===
или коэрциции типов с помощью if
. (undefined
, в отличие от null
, также может быть переопределено в средах ECMAScript 3, что делает его ненадежным для сравнения, хотя почти все распространенные среды сейчас совместимы с ECMAScript 5 или выше).
if (typeof someUndeclaredVariable == "undefined") {
// Works
}
if (someUndeclaredVariable === undefined) {
// Throws an error
}
Я лично использую
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
) работает нормально.Если вам действительно интересно, вы можете прочитать об этом самостоятельно.)
Я использую его как параметр функции и исключаю его при выполнении функции таким образом я получаю "настоящий" undefined. Хотя это требует, чтобы вы поместили свой код в функцию. Я обнаружил это при чтении исходного кода jQuery.
undefined = 2;
(function (undefined) {
console.log(undefined); // prints out undefined
// and for comparison:
if (undeclaredvar === undefined) console.log("it works!")
})()
Конечно, вы могли бы просто использовать typeof
. Но весь мой код в любом случае обычно находится внутри содержащей функцию, поэтому использование этого метода, вероятно, сэкономит мне несколько байтов здесь и там.