简化对未定义变量/属性的检查

时间:2016-02-26 16:20:25

标签: javascript undefined

当对象本身可能是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)检查对象,然后检查它的属性。

我能做到更干净吗?

5 个答案:

答案 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.

 }