Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript未定义对象的类型子属性_Javascript_Node.js - Fatal编程技术网

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

Javascript未定义对象的类型子属性,javascript,node.js,Javascript,Node.js,假设我想检查对象Foo的属性是否已定义,我将在本场景中使用: typeof Foo.property != 'undefined' 但是,如果不仅属性不存在,而且对象未定义,这将导致错误 是否有任何单行方法检查是否定义了对象属性,并在以下情况下返回false: 如果未定义对象属性 如果对象未定义 为什么我要这样做:我正在用NodeJS编写一个脚本,它使用一个类,这个类也将在前端使用,而不是维护两个不同的文件,这两个文件除了两个环境的细微变化外基本相同,我想用一些基本的IF逻辑来区分环境 其他可

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

或者更简单地说:

Foo !== undefined && Foo.property !== undefined
编辑:正如所指出的,这是由于所谓的短路评估。这基本上意味着如果第一部分的计算结果为false Foo!==未定义则第二部分永远不会计算。

您可以使用and&&子句

或者更简单地说:

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

编辑:正如所指出的,这是由于所谓的短路评估。这基本上意味着如果第一部分的计算结果为false Foo!==如果没有定义,则第二部分永远不会被计算。

想到的最简单的答案是。它没有你的100%严格,但需要非常特殊的情况才能打破它:

if (Foo && 'property' in Foo) {
Foo对象的计算结果为布尔值。null或未定义的类型将为false,任何对象都将为true。我们还检查键/值对的键侧,而不是值。从技术上讲,可以使用key属性,但实际值未定义。在这种情况下,这将返回false


一个警告:如果Foo是另一个值类型:true,12,function…,那么第一个条件可能会通过,但我不相信第二个条件会通过。我想到的最简单的答案是。它没有你的100%严格,但需要非常特殊的情况才能打破它:

if (Foo && 'property' in Foo) {
Foo对象的计算结果为布尔值。null或未定义的类型将为false,任何对象都将为true。我们还检查键/值对的键侧,而不是值。从技术上讲,可以使用key属性,但实际值未定义。在这种情况下,这将返回false


一个警告:如果Foo是另一个值类型:true,12,function…,那么第一个条件可能会通过,但我不相信第二个条件会通过。好的,我提出了一个小函数,它在初始测试时实现了我想要的功能,但我只测试了大约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;
}

好的,我提出了一个小函数,它在初始测试时实现了我想要的功能,但我只测试了大约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;
}

我只是想指出操作数的顺序在这里很重要。这就是所谓的短路评估。完全同意Mike C的观点,我在Douglas crockford的一本很棒的书《JavaScript好的部分》中读到了这一点。是的,我知道我可以这样做,但请看一下我问题中的其他用例。对于嵌套较深的对象,我必须分别键入每个属性,直到找到我感兴趣的单个属性,而不是检查单个属性。@AdamBaranyai,除非在数组['case1','info1'中有属性链那么这就是你必须处理的事情。注意,Foo!==如果Foo未声明,undefined将抛出错误。否则就没关系了,我只是想指出操作数的顺序在这里很重要。这就是所谓的短路评估。完全同意Mike C的观点,我在Douglas crockford的一本很棒的书《JavaScript好的部分》中读到了这一点。是的,我知道我可以这样做,但请看一下我问题中的其他用例。对于嵌套较深的对象,我必须分别键入每个属性,直到找到我感兴趣的单个属性,而不是检查单个属性。@AdamBaranyai,除非在数组['case1','info1'中有属性链那么这就是你必须处理的事情。注意,Foo!==如果Foo未声明,undefined将抛出错误。O
从理论上讲,这很好。一个关于便携性的小提示;查找全局对象的一种与环境无关的方法是运行一个不带调用参数的IIFE,这将是它内部的全局。不幸的是,我不知道IIFE是什么,但是如果您想编辑我的答案,或者使用该方法添加一个新答案,我会更新/接受它:立即调用函数表达式。所以,像这样:var global;函数{global=this;};小提示,便于携带;查找全局对象的一种与环境无关的方法是运行一个不带调用参数的IIFE,这将是它内部的全局。不幸的是,我不知道IIFE是什么,但是如果您想编辑我的答案,或者使用该方法添加一个新答案,我会更新/接受它:立即调用函数表达式。所以,像这样:var global;函数{global=this;};