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