2016-02-26 3 views
0

Я пытаюсь найти более эффективный способ оценки свойств объекта в операциях if, когда сам объект может быть undefined.Упрощение проверок неопределенных переменных/свойств

Вот простой пример того, что я пытаюсь сделать:

var a = {'x':'hello'}; 
var b; 

if(a.x) { console.log('hello'); } // 'hello' 
if(a && a.x) { console.log('hello'); } // 'hello' 

if(b.x) { console.log('hello'); } // TypeError: Cannot read property 'x' of undefined 
if(b && b.x) { console.log('hello'); } // 

jsfiddle link

Я считаю себя того, чтобы использовать второй синтаксис if(b && b.x) для проверки объекта, а затем это свойство.

Есть ли более чистый способ, я могу это сделать?

+1

'b && b.x' является обычным способом, так что это не будет _wrong_, если ясно, основан на мнениях. –

+1

Вероятно, нет ничего более эффективного исполнения *, чем использование '&&'. –

+0

Не могли бы вы определить * cleaner *? Каким будет ваш предпочтительный синтаксис? – vol7ron

ответ

-2

ли вы пробовали

if(b.hasOwnProperty('x')){ 

// Your code here. 

} 
+1

Это вызовет ошибку, потому что если 'b'' undefined', значит, это не поможет. –

+1

Пожалуйста, объясните свое решение –

0

Ярчайший способ определить, является ли не определена переменная с помощью typeof:

if(typeof obj === 'undefined'){}; 

На практике я делаю такие операции в следующем пути, когда я нужен команда для выполнения:

obj && obj.prop && console.log('hello'); 

Когда я мак ИНГ некоторого задания я использовать || (или) оператор и уверен объект obj существует:

var someVar = obj.x || obj.z; 

Был бы присвоить первое значения не является falsy в someVar, однако она может быть скорректирована с использованием typeof для поймать особенно «неопределенный» значение.

0

Если у вас есть объекты со сходной структурой, создайте вспомогательную функцию и передайте объект этому помощнику. Что-то вроде этого?

function check(obj, prop) { 
    if (obj && typeof obj == "object") { 
    if (obj[prop]) console.log(obj[prop]); 
    } else return false; 
} 

var foo = {x: 12}; 
var baz; 
check(foo, "x"); 
check(baz, "x"); 
+0

Это будет ломаться для 'baz = null' (если' null' следует обрабатывать так же, как 'undefined', кто знает). –

+0

Да. Проверьте обновленную версию. Конечно, оба очень примитивны. – loadaverage

+0

Ошибка для объектов, созданных с помощью объекта Object.create (null). 'if (obj && typeof obj === 'object')' будет работать нормально. –

0
var checkDeepProp = function (obj, deepProp) { 
    var dp = (deepProp || '').split('.'); 
    var prop; 
    var has = true; 
    var initObj = obj; 
    var i; 
    var length = dp.length; 
    for (i = 0; i < length; i += 1) { 
    initObj = initObj[dp[i]]; 
    if (typeof initObj === 'undefined') { 
     has = false; 
     break; 
    } 
    } 
    return has; 
} 

var has = checkDeepProp({a: {b: 'xcv'}}, 'a.b'); 

что-то подобное?

0

К сожалению, дополнительные 5 символов (b &&), или 3 без пробелов (b&&), будут такими же чистыми, как вы собираетесь получить. Если вы хотите получить фантазии, вы можете найти массив ключей:

function (obj) { 
    if(!!~Object.keys(obj || {}).indexOf('x')){ 
     ... 
    } 
} 

Обратите внимание на || {} в случае, если объект не существует. Конечно, вы заметите, что всегда бесполезно пытаться определить, содержит ли переменная объект, а не назначает его в первую очередь. Например:

function(obj){ 
    obj = obj || {}; // set to an object if it doesn't already exist 

    if(obj.x) { 
    ... 
    } 
} 
Смежные вопросы