当对象本身可能是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'); } //
我发现自己必须使用第二种语法if(b && b.x)
检查对象,然后检查它的属性。
我能做到更干净吗?
答案 0 :(得分:0)
确定变量是否未定义的最明确方法是使用typeof:
if(typeof obj === 'undefined'){};
实际上,当我需要执行一个命令时,我正在以下一种方式执行此类操作:
obj && obj.prop && console.log('hello');
当我进行某项任务时,我使用||
(或)运算符,确定对象obj
存在:
var someVar = obj.x || obj.z;
它会将第一个非虚假值分配给someVar
,但可以调整为使用typeof来捕捉特别是“未定义”值
答案 1 :(得分: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");
答案 2 :(得分: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');
类似的东西?
答案 3 :(得分: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 ) {
...
}
}
答案 4 :(得分:-2)
你试过吗
if(b.hasOwnProperty('x')){
// Your code here.
}