6

Эквивалент isset() в JavaScript

5

Описание проблемы

В 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 ответ(ов)

0

Ваш код проверяет, существует ли свойство foo в объекте obj. Если свойство не установлено, то блок кода внутри условного оператора выполняется. Вы можете использовать этот подход для выполнения определённых действий, когда свойство отсутствует.

Переведя ваш код на русский, получится следующее:

if (!('foo' in obj)) {
  // свойство не установлено.
}

Если вам нужна дополнительная информация или есть конкретный вопрос по этому коду, пожалуйста, уточните, и я постараюсь помочь!

0

В вашем вопросе упоминается, что попытка ссылаться на несуществующую переменную вызывает 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 может быть небезопасным и замедлять выполнение, поэтому его рекомендуется избегать, если возможно.

0

Этот простой способ работает, но не подходит для проверки глубоких объектов.

Вот пример функции, которая проверяет, существует ли значение в глубоком объекте:

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, если хотя бы один уровень отсутствует.

0

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

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, подтверждая, что все указанные пути к свойствам существуют.

Это полезно, например, когда вам нужно проверить, есть ли у объекта определённые свойства, прежде чем к ним обращаться, что помогает избежать потенциальных ошибок во время выполнения.

0

Это решение сработало для меня:

function isset(object) {
    return (typeof object !== 'undefined');
}
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь