Обнаружение неопределенного свойства объекта - PullRequest
2613 голосов
/ 26 августа 2008

Как лучше всего проверить, не определено ли свойство объекта в JavaScript?

Ответы [ 41 ]

16 голосов
/ 25 сентября 2012

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

if (obj && obj.prop) {
  // Do something;
}

Если obj или obj.prop не определены, имеют значение null или «falsy», оператор if не будет выполнять блок кода. Это обычно желаемое поведение в большинстве операторов блока кода (в JavaScript).

13 голосов
/ 19 декабря 2013

В статье Изучение бездны пустоты и неопределенности в JavaScript Я читал, что фреймворки типа Underscore.js используют эту функцию:

function isUndefined(obj){
    return obj === void 0;
}
11 голосов
/ 10 февраля 2014

' if (window.x) {} ' безопасен от ошибок

Скорее всего, вы хотите if (window.x). Эта проверка безопасна, даже если x не был объявлен (var x;) - браузер не выдает ошибку.

Пример: я хочу знать, поддерживает ли мой браузер History API

if (window.history) {
    history.call_some_function();
}

Как это работает:

window - это объект, который содержит все глобальные переменные в качестве своих членов, и разрешено пытаться получить доступ к несуществующему члену. Если x не был объявлен или не был установлен, то window.x возвращает undefined . undefined приводит к false , когда if () оценивает его.

10 голосов
/ 05 мая 2014
"propertyName" in obj //-> true | false
10 голосов
/ 15 февраля 2015

Прочитав это, я поражен, что не видел этого. Я нашел несколько алгоритмов, которые будут работать для этого.

Никогда не определен

Если значение объекта никогда не определялось, это не позволит вернуть true, если оно определено как null или undefined. Это полезно, если вы хотите, чтобы значение true возвращалось для значений, установленных как undefined

if(obj.prop === void 0) console.log("The value has never been defined");

Определено как неопределенное или никогда не определено

Если вы хотите, чтобы оно получилось как true для значений, определенных со значением undefined или никогда не определенных, вы можете просто использовать === undefined

if(obj.prop === undefined) console.log("The value is defined as undefined, or never defined");

Определяется как ложное значение, неопределенное, нулевое или никогда не определенное.

Обычно люди просят у меня алгоритм, чтобы выяснить, является ли значение ложным, undefined или null. Следующие работы.

if(obj.prop == false || obj.prop === null || obj.prop === undefined) {
    console.log("The value is falsy, null, or undefined");
}
9 голосов
/ 24 мая 2017

Просто все, что не определено в JavaScript, это undefined , не имеет значения, является ли оно свойством внутри объекта / массива или просто простой переменной ...

JavaScript имеет typeof, что позволяет очень легко обнаружить неопределенную переменную.

Просто проверьте, если typeof whatever === 'undefined', и он вернет логическое значение.

Вот как пишется знаменитая функция isUndefined() в AngularJs v.1x:

function isUndefined(value) {return typeof value === 'undefined';} 

Итак, как вы видите, функция получает значение, если это значение определено, она вернет false, в противном случае для неопределенных значений верните true.

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

var stackoverflow = {};
stackoverflow.javascipt = 'javascript';
var today;
var self = this;
var num = 8;
var list = [1, 2, 3, 4, 5];
var y = null;

и мы проверяем их, как показано ниже, вы можете увидеть результаты перед ними в качестве комментария:

isUndefined(stackoverflow); //false
isUndefined(stackoverflow.javascipt); //false
isUndefined(today); //true
isUndefined(self); //false
isUndefined(num); //false
isUndefined(list); //false
isUndefined(y); //false
isUndefined(stackoverflow.java); //true
isUndefined(stackoverflow.php); //true
isUndefined(stackoverflow && stackoverflow.css); //true

Как вы видите, мы можем проверить что-нибудь, используя что-то подобное в нашем коде, как уже упоминалось, вы можете просто использовать typeof в своем коде, но если вы используете его снова и снова, создайте функцию, подобную угловой выборке, которая Я разделяю и продолжаю использовать, как показано ниже, в СУХОМ коде

Также еще одна вещь, для проверки свойства объекта в реальном приложении, в котором вы не уверены, существует ли этот объект или нет, проверьте, существует ли объект первым.

Если вы проверите свойство объекта, а объект не существует, выдаст ошибку и остановит работу всего приложения.

isUndefined(x.css);
VM808:2 Uncaught ReferenceError: x is not defined(…)

Так просто, что вы можете заключить в оператор if, как показано ниже:

if(typeof x !== 'undefined') {
  //do something
}

Что также равно isDefined в Angular 1.x ...

function isDefined(value) {return typeof value !== 'undefined';}

Также другие фреймворки javascript, такие как подчеркивание, имеют аналогичную проверочную проверку, но я рекомендую использовать typeof, если вы уже не используете фреймворки.

Я также добавляю этот раздел из MDN, в котором есть полезная информация о typeof, undefined и void (0).

Строгое равенство и неопределенность
Вы можете использовать неопределенные операторы и операторы строгого равенства и неравенства, чтобы определить, имеет ли переменная ценность. В следующем коде переменная x не определена, а если утверждение оценивается как истинное.

var x;
if (x === undefined) {
   // these statements execute
}
else {
   // these statements do not execute
}

Примечание: оператор строгого равенства, а не стандартное равенство оператор должен быть использован здесь, потому что x == undefined также проверяет, является ли х равен нулю, а строгое равенство - нет. нуль не эквивалентно не определено. Подробности смотрите в операторах сравнения.


Тип оператора и неопределенный
В качестве альтернативы можно использовать typeof:

var x;
if (typeof x === 'undefined') {
   // these statements execute
}

Одной из причин использования typeof является то, что он не выдает ошибку, если переменная не была объявлена.

// x has not been declared before
if (typeof x === 'undefined') { // evaluates to true without errors
   // these statements execute
}

if (x === undefined) { // throws a ReferenceError

}

Однако этого вида техники следует избегать. JavaScript это статически ограниченный язык, поэтому знание, объявлена ​​ли переменная, может быть прочитанным, видя, объявлено ли это в окружающем контексте. единственное исключение - глобальная область, но глобальная область связана с глобальный объект, поэтому проверка наличия переменной в Глобальный контекст может быть сделан путем проверки наличия свойства на глобальный объект (например, с помощью оператора in).


Пустой оператор и неопределенный

Оператор void является третьей альтернативой.

var x;
if (x === void 0) {
   // these statements execute
}

// y has not been declared before
if (y === void 0) {
   // throws a ReferenceError (in contrast to `typeof`)
}

подробнее> здесь

9 голосов
/ 17 октября 2011

Вы можете получить массив с неопределенным путем, используя следующий код.

 function getAllUndefined(object) {

        function convertPath(arr, key) {
            var path = "";
            for (var i = 1; i < arr.length; i++) {

                path += arr[i] + "->";
            }
            path += key;
            return path;
        }


        var stack = [];
        var saveUndefined= [];
        function getUndefiend(obj, key) {

            var t = typeof obj;
            switch (t) {
                case "object":
                    if (t === null) {
                        return false;
                    }
                    break;
                case "string":
                case "number":
                case "boolean":
                case "null":
                    return false;
                default:
                    return true;
            }
            stack.push(key);
            for (k in obj) {
                if (obj.hasOwnProperty(k)) {
                    v = getUndefiend(obj[k], k);
                    if (v) {
                        saveUndefined.push(convertPath(stack, k));
                    }
                }
            }
            stack.pop();

        }

        getUndefiend({
            "": object
        }, "");
        return saveUndefined;
    }

jsFiddle ссылка

8 голосов
/ 26 августа 2008

Решение неверное. В JavaScript

null == undefined

вернет true, потому что они оба "приводятся" к логическому значению и ложны. Правильный способ будет проверять

if (something === undefined)

, который является оператором идентификации ...

8 голосов
/ 02 января 2014

Сравните с void 0, для краткости.

if (foo !== void 0)

Это не так многословно, как if (typeof foo !== 'undefined')

7 голосов
/ 15 августа 2013

Вот моя ситуация:

Я использую результат вызова REST. Результат должен быть проанализирован из JSON в объект JavaScript.

Есть одна ошибка, которую мне нужно защитить. Если аргументы для вызова rest были неправильными, поскольку пользователь указал неправильные аргументы, вызов rest возвращается в основном пустым.

Используя этот пост, чтобы помочь мне защититься от этого, я попробовал это.

if( typeof restResult.data[0] === "undefined" ) { throw  "Some error"; }

В моей ситуации, если restResult.data [0] === "object", я могу смело начинать проверку остальных членов. Если значение не определено, выведите ошибку, как указано выше.

Что я говорю, так это то, что для моей ситуации все предложения, приведенные выше в этом посте, не сработали. Я не говорю, что я прав, а все не правы. Я вообще не мастер JavaScript, но надеюсь, это кому-нибудь поможет.

...