让我们说我想检查是否定义了对象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。
答案 0 :(得分:4)
您可以使用和(&&
)子句。
typeof Foo !== 'undefined' && typeof Foo.property !== 'undefined'
或者更简单地说:
Foo !== undefined && Foo.property !== undefined
编辑:正如David Titarenco指出的那样,这可以归结为短路评估。这基本上意味着如果第一部分的评估结果为假(Foo !== undefined
),则永远不会评估第二部分。
答案 1 :(得分:1)
想到的最简单的答案就是这个。它不像你的100%严格,但要打破它需要一个非常不寻常的情况:
if (Foo && 'property' in Foo) {
Foo
对象被评估为boolean。 null或undefined类型将为false,任何对象都为true。我们还检查键/值对的“键”侧,而不是值。技术上可以拥有键property
,但是它具有实际值undefined
。在这种情况下,这将返回false。
一个警告:如果Foo
是另一种值类型:true
,12
,function()...
,那么第一个条件可能会通过(但我不相信第二个会)
答案 2 :(得分:1)
好的,我想出了一个小功能,在初始测试中做了我想要的,但是我只测试了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
}