Эквивалент isset() в JavaScript
Описание проблемы
В PHP можно использовать конструкцию if(isset($array['foo'])) { ... }
для проверки наличия элемента в массиве. В JavaScript аналогом является if(array.foo) { ... }
, но это не совсем то же самое. Условие также будет ложным, если array.foo
существует, но равно false
или 0
(возможно, и для других значений).
Каков идеальный эквивалент функции PHP isset
в JavaScript?
С более широкой точки зрения, мне также был бы полезен общий и полный справочник по обработке переменных в JavaScript, которые не существуют, переменных без значений и так далее.
Обновление: 11 лет и 11 месяцев назад я задал этот вопрос, и, о диво, он до сих пор вызывает активность. Теперь я уверен, что когда я его писал, я хотел лишь узнать, как проверить наличие свойства в ассоциативном массиве (или, как его называют, словаре), и поэтому правильные (для меня) ответы связаны с использованием hasOwnProperty
или оператора in
. Я не интересовался проверкой локальных или глобальных переменных.
Хотя я хорошо это помню, это намерение не совсем ясно из написанного вопроса и даже прямо противоречит ему! Я никогда не упоминал ассоциативный массив, и isset
в PHP также выполняет и другие функции. Пусть это станет уроком для всех нас о том, как важно правильно формулировать свои требования в вопросе, а также о том, что глобальные переменные, локальные переменные, свойства объектов, ключи словарей и подобные вещи не являются чем-то взаимозаменяемым.
Тем временем (ха), многие люди также предоставили на это ответы, поэтому для тех, кто нашел этот вопрос через Google, я рад, что моя неопределенность в какой-то мере помогла. В любом случае, просто хотел это прояснить.
5 ответ(ов)
Ваш код проверяет, существует ли свойство foo
в объекте obj
. Если свойство не установлено, то блок кода внутри условного оператора выполняется. Вы можете использовать этот подход для выполнения определённых действий, когда свойство отсутствует.
Переведя ваш код на русский, получится следующее:
if (!('foo' in obj)) {
// свойство не установлено.
}
Если вам нужна дополнительная информация или есть конкретный вопрос по этому коду, пожалуйста, уточните, и я постараюсь помочь!
В вашем вопросе упоминается, что попытка ссылаться на несуществующую переменную вызывает ReferenceError
, прежде чем функция теста будет выполнена. Давайте разберем это на примере.
Если вы выполните следующий код:
if (isset(someVar))
doStuff(someVar);
то, если переменная someVar
не существует, вы получите ReferenceError
, и функция isset
не будет выполнена.
Однако, если вы передадите имя переменной в виде строки, например: isset('novar');
, это может сработать:
function isset(strVariableName) {
try {
eval(strVariableName);
} catch(err) {
if (err instanceof ReferenceError)
return false;
}
return true;
}
В этом примере функция isset
использует eval
, чтобы проверить наличие переменной по имени, переданному в виде строки. Если переменная не существует, будет выброшено исключение ReferenceError
, и функция вернет false
, что позволяет избежать ошибки выполнения.
Этот подход работает, но следует отметить, что использование eval
может быть небезопасным и замедлять выполнение, поэтому его рекомендуется избегать, если возможно.
Этот простой способ работает, но не подходит для проверки глубоких объектов.
Вот пример функции, которая проверяет, существует ли значение в глубоком объекте:
function isset(obj, key) {
return key.split('.').every(function(part) {
if (obj !== null && obj !== undefined && part in obj) {
obj = obj[part];
return true;
}
return false;
});
}
В данном примере мы передаем объект и строку с ключом, который может содержать вложенные свойства, разделенные точками. Функция проверяет, существуют ли все уровни объекта, и возвращает true
, если они существуют, или false
, если хотя бы один уровень отсутствует.
Вы можете использовать эту универсальную функцию для проверки на существование свойств как в примитивных переменных, так и в массивах и объектах, что помогает избежать ошибок.
isset = function(obj) {
var i, max_i;
if (obj === undefined) return false;
for (i = 1, max_i = arguments.length; i < max_i; i++) {
if (obj[arguments[i]] === undefined) {
return false;
}
obj = obj[arguments[i]];
}
return true;
};
console.log(isset(obj)); // возвращает false
var obj = 'huhu';
console.log(isset(obj)); // возвращает true
obj = {hallo: {hoi: 'hoi'}};
console.log(isset(obj, 'niet')); // возвращает false
console.log(isset(obj, 'hallo')); // возвращает true
console.log(isset(obj, 'hallo', 'hallo')); // возвращает false
console.log(isset(obj, 'hallo', 'hoi')); // возвращает true
Функция isset
принимает объект и список ключей, проверяя, существуют ли они в переданном объекте. В случае, если любой из указанных ключей отсутствует или объект сам по себе неопределён (undefined), функция возвращает false
. В противном случае она возвращает true
, подтверждая, что все указанные пути к свойствам существуют.
Это полезно, например, когда вам нужно проверить, есть ли у объекта определённые свойства, прежде чем к ним обращаться, что помогает избежать потенциальных ошибок во время выполнения.
Это решение сработало для меня:
function isset(object) {
return (typeof object !== 'undefined');
}
Где найти документацию по форматированию даты в JavaScript?
В чем разница между String.slice и String.substring?
Проверка соответствия строки регулярному выражению в JS
Существует ли ссылка на "последнюю" библиотеку jQuery в Google APIs?
Как создать диалог с кнопками "Ок" и "Отмена"