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

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

Ответы [ 41 ]

7 голосов
/ 03 марта 2016

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

var a = obj.prop || defaultValue;

Подходит, если у вас есть функция, которая получает дополнительное свойство конфигурации:

var yourFunction = function(config){

   this.config = config || {};
   this.yourConfigValue = config.yourConfigValue || 1;
   console.log(this.yourConfigValue);

}

Сейчас выполняется

yourFunction({yourConfigValue:2});
//=> 2

yourFunction();
//=> 1

yourFunction({otherProperty:5});
//=> 1
6 голосов
/ 18 июня 2014

Все ответы неполные. Это правильный способ узнать, что существует свойство, определенное как неопределенное:

var hasUndefinedProperty = function hasUndefinedProperty(obj, prop){
  return ((prop in obj) && (typeof obj[prop] == 'undefined')) ;
} ;

Пример:

var a = { b : 1, e : null } ;
a.c = a.d ;

hasUndefinedProperty(a, 'b') ; // false : b is defined as 1
hasUndefinedProperty(a, 'c') ; // true : c is defined as undefined
hasUndefinedProperty(a, 'd') ; // false : d is undefined
hasUndefinedProperty(a, 'e') ; // false : e is defined as null

// And now...
delete a.c ;
hasUndefinedProperty(a, 'c') ; // false : c is undefined

Жаль, что это был правильный ответ, похоронен в неправильных ответах> _ <</p>

Так что, для тех, кто проходит мимо, я дам вам неопределенные бесплатно !!

var undefined ; undefined ; // undefined
({}).a ;                    // undefined
[].a ;                      // undefined
''.a ;                      // undefined
(function(){}()) ;          // undefined
void(0) ;                   // undefined
eval() ;                    // undefined
1..a ;                      // undefined
/a/.a ;                     // undefined
(true).a ;                  // undefined
6 голосов
/ 08 июля 2014

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

//Just in JavaScript
var s; // Undefined
if (typeof s == "undefined" || s === null){
    alert('either it is undefined or value is null')
}

Если вы используете библиотеку jQuery, то для обоих случаев будет достаточно jQuery.isEmptyObject(),

var s; // Undefined
jQuery.isEmptyObject(s); // Will return true;

s = null; // Defined as null
jQuery.isEmptyObject(s); // Will return true;

//Usage
if (jQuery.isEmptyObject(s)) {
    alert('Either variable:s is undefined or its value is null');
} else {
     alert('variable:s has value ' + s);
}

s = 'something'; // Defined with some value
jQuery.isEmptyObject(s); // Will return false;
6 голосов
/ 15 декабря 2014

Если вы используете Angular:

angular.isUndefined(obj)
angular.isUndefined(obj.prop)

Underscore.js:

_.isUndefined(obj) 
_.isUndefined(obj.prop) 
6 голосов
/ 06 марта 2015

Я использую if (this.variable), чтобы проверить, определено ли оно. Простой if (variable), рекомендуется выше , для меня не получается. Оказывается, это работает только тогда, когда переменная является полем некоторого объекта, obj.someField, чтобы проверить, определено ли оно в словаре. Но мы можем использовать this или window в качестве объекта словаря, поскольку любая переменная является полем в текущем окне, насколько я понимаю. Поэтому вот тест

if (this.abc) alert("defined"); else alert("undefined");

abc = "abc";
if (this.abc) alert("defined"); else alert("undefined");

Сначала обнаруживается, что переменная abc не определена и определяется после инициализации.

4 голосов
/ 13 июля 2010
function isUnset(inp) {
  return (typeof inp === 'undefined')
}

Возвращает false, если переменная установлена, и true, если не определено.

Тогда используйте:

if (isUnset(var)) {
  // initialize variable here
}
3 голосов
/ 28 октября 2017

Я предлагаю три способа для тех, кто ожидает странных ответов:

function isUndefined1(val) {
    try {
        val.a;
    } catch (e) {
        return /undefined/.test(e.message);
    }
    return false;
}
function isUndefined2(val) {
    return !val && val+'' === 'undefined';
}
function isUndefined3(val) {
    const defaultVal={};
    return ((input=defaultVal)=>input===defaultVal)(val);
}
function test(func){
    console.group(`test start :`+func.name);
    console.log(func(undefined));
    console.log(func(null));
    console.log(func(1));
    console.log(func("1"));
    console.log(func(0));
    console.log(func({}));
    console.log(func(function () { }));
    console.groupEnd();
}
test(isUndefined1);
test(isUndefined2);
test(isUndefined3);

isUndefined1:

Попробуйте получить свойство входного значения, проверьте сообщение об ошибке, если оно существует. Если входное значение не определено, сообщение об ошибке будет Uncaught TypeError: Невозможно прочитать свойство 'b' из неопределенного

isUndefined2:

Преобразовать входное значение в строку для сравнения с "undefined" и убедиться, что оно отрицательное.

isUndefined3:

В js необязательный параметр работает, когда входное значение точно равно undefined.

3 голосов
/ 14 января 2016

от lodash.js.

var undefined;
function isUndefined(value) {
  return value === undefined;
}

Создает локальную переменную с именем undefined, которая инициализируется значением по умолчанию - действительным undefined, затем сравнивает value с переменной undefined.

3 голосов
/ 16 июня 2014

Тоже самое можно написать короче:

if (!variable){
    //do it if variable is Undefined
}

или

if (variable){
    //do it if variable is Defined
}
3 голосов
/ 09 октября 2014

Я хотел бы показать вам кое-что, что я использую для защиты переменной undefined:

Object.defineProperty(window, 'undefined', {});

Это запрещает кому-либо изменять значение window.undefined, поэтому уничтожает код на основе этой переменной. При использовании "use strict" все попытки изменить его значение приведут к ошибке, в противном случае это будет игнорироваться.

...