Javascript“deep"检查是否有定义

Javascript "deep" check for defined

本文关键字:检查 是否 定义 quot deep Javascript      更新时间:2023-09-26

我可以发誓,曾经有一次,我遇到一些代码,使用一些js库(可能是lodash?? ?)做一个"深度"检查是否有东西被定义。

的例子:

someLib.isDefined(anObject.aNestedObject.anotherNestedObject);

(如果定义了另一个nestedobject将返回true,但如果anObject或aNestedObject未定义将返回false(并且不会抛出异常)。

是我完全在做梦吗,还是有一些众所周知的函数可以做到这一点?

正如我在评论中所写的,我认为这是不可能的。
表达式anObject.aNestedObject.anotherNestedObjectsomeLib.isDefined函数被调用之前求值,因此在函数有机会做任何事情之前会抛出异常(如果anObject或aNestedObject不存在)。
也许如果你把它作为一个字符串传递:someellib . isdefined (" anobject . anestedoobject . anothernestedobjec ")

但是,像这样检查很容易:

if (anObject && anObject.aNestedObject && anObject.aNestedObject.anotherNestedObject) {
    ...
}

或者只是实现你自己的函数,这很简单:

function exists(obj: any, keys: string | string[]) {
    if (typeof keys === "string") {
        keys = keys.split(".");
    }
    return keys.every(key => {
        if (!obj) {
            return false;
        }
        obj = obj[key];
        return true;
    });
}

(code in playground)

Lodash's has():

_.has(object, path)

的例子:

var object = {a: {b: 'test', c: 'test2'}};
_.has(object, 'a.b');
// => true
_.has(object, 'a.d');
// => false

全部文档
_.has()

的源代码

不,没有众所周知的函数可以做到这一点,但您可以通过以下方式安全地检查:

if (typeof anObject != "undefined"  
&& typeof anObject.aNestedObject != "undefined" 
&& typeof anObject.aNestedObject.anotherNestedObject != "undefined") {
   console.log("defined");
}else{
  console.log("undefined");
}