未定义对象子属性的Javascript typeof

假设我想检查是否定义了对象Foo的属性,我将在这种情况下使用:

typeof Foo.property != 'undefined' 

但是,如果不仅属性不存在,而且对象未定义,则会导致错误。

是否有单行的方式来检查是否定义了一个对象属性,并在以下情况下返回false:

  • 如果对象属性没有定义
  • 如果对象没有定义

为什么我要这样做:我正在写一个NodeJS的脚本,它使用了一个类,它也将在前端使用,而不是维护两个不同的文件,除了对于两个环境,我想用一些基本的IF逻辑区分环境。

其他可能的用例:假设我们有以下对象:

 function Foo() { this.case1={ info1: 'something', info2: 'something', ..... info1000: 'something' } this.case2={ info1: 'something', info2: 'something', ...... info1000: 'something' } } 

如果我想决定哪种情况适用于我,而决定是在内部信息之一,我首先要检查是否存在相应的情况,然后是否存在相应的信息(2个条件):

  if (typeof Foo.case1 != 'undefined') && (typeof Foo.case1.info1 != 'undefined') 

如果这是一个更深层次的嵌套对象,将会有很多条件检查和打字,以获得一些基本信息:如果case1根本不存在,那么我将使用case2。

你可以使用&& )子句。

 typeof Foo !== 'undefined' && typeof Foo.property !== 'undefined' 

或者更简单地说:

 Foo !== undefined && Foo.property !== undefined 

编辑:正如大卫Titarenco指出,这是有道理的东西称为短路评估。 这基本上意味着如果第一部分评估为false( Foo !== undefined ),那么第二部分就不会被评估。

想到的最简单的答案就是这个。 这并不像你的那样严格,但是要打破它却需要非常不寻常的情况:

 if (Foo && 'property' in Foo) { 

Foo对象被评估为布尔值。 null或undefinedtypes将是false,任何对象都将为true。 我们还检查键/值对的“关键”侧,而不是值。 具有关键property在技​​术上是可能的,但是它具有undefined的实际值。 在这种情况下,这将返回false。

一个警告:如果Foo是另一个值types: true12function()... ,那么第一个条件可能会通过(但我不相信第二个会)

好吧,我想出了一个小function,在最初的testing中做了我想要的,但是我只testing了5分钟,所以可能会有错误,如果是,请指出:

 function isDefined(path, namespace) { if (typeof namespace == 'undefined') { namespace=global; // global is the default namespace for NodeJS, // change this to window if you use it in a browser } path=path.split("."); for (var i=0;i<path.length ;i++) { if (typeof namespace[path[i]] == 'undefined') return false; else namespace=namespace[path[i]]; } return true; } 

用法:如果你想testing例如Test.Test1.Test2.Test3.Test4.Test5.Test6被定义,你可以像这样使用它:

 if (isDefined('Test.Test1.Test2.Test3.Test4.Test5.Test6')===true) { //it is defined }