繁体   English   中英

未定义对象子属性的Javascript类型

[英]Javascript typeof of undefined objects subproperty

假设我想检查对象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。

您可以使用and&& )子句。

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

或更简单地说:

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

编辑:正如David Titarenco所指出的,这之所以有效,是因为人们将其称为短路评估。 这基本上意味着,如果第一部分的评估结果为false( Foo !== undefined ),那么第二部分就永远不会评估。

想到的最简单的答案就是这个。 它没有您的100%严格,但要打破这种情况将需要非常不同寻常的情况:

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

Foo对象被评估为布尔值。 null或未定义的类型为false,任何对象为true。 我们还将检查键/值对的“键”侧,而不是值。 从技术上讲,可以具有 key property ,但要使其具有undefined的实际值。 在这种情况下,它将返回false。

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

好的,我想出了一个小功能,该功能在初始测试中就可以满足我的要求,但是我只测试了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;
}

用法:例如,如果要测试是否定义了Test.Test1.Test2.Test3.Test4.Test5.Test6,则可以这样使用:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM