Javascript获取对象属性和子属性
我正在尝试访问以下对象属性:Javascript获取对象属性和子属性,javascript,Javascript,我正在尝试访问以下对象属性: var scope1 = {a: {value: 25}}; var scope2 = undefined; var v1 = scope1.b.value || 0; // TypeError: Cannot read property 'value' of undefined var v2 = scope2.b.value || 0; // TypeError: Cannot read property 'value' of undefined 显然,|
var scope1 = {a: {value: 25}};
var scope2 = undefined;
var v1 = scope1.b.value || 0; // TypeError: Cannot read property 'value' of undefined
var v2 = scope2.b.value || 0; // TypeError: Cannot read property 'value' of undefined
显然,| |接线员没有给我想要的。我知道我可以做以下事情
var vv2 = (scope1 && scope1.b ? scope1.b.value : 0);
但是这使得代码非常冗长。。。有人知道有没有更简单的方法来做我想做的事吗?谢谢。通常的答案是
&&
操作员:
var v1 = scope1.b && scope1.b.value || 0;
…因为与|
一样,&&
是:&&
计算左操作数,如果是假操作数,则将该假值作为其结果;如果左侧操作数值为truthy,&&
计算右侧操作数并将该值作为其结果
因此,如果scope1.b
是未定义的
:
// We start with
scope1.b && scope1.b.value || 0
// which is
undefined && scope1.b.value || 0
// which is
undefined || 0
// which is
0
…但如果scope.b
是一个与对象引用类似的真实值:
// We start with
scope1.b && scope1.b.value || 0
// which is
scope1.b.value || 0
// which is
scope1.b.value // *IF* scope1.b.value is truthy, or
0 // If it isn't
(回想一下,“falsey”值是未定义的,空的,0
,,“
,NaN
,当然,false
,“truthy”值都是其他值。)
例如:
var范围1;
scope1={a:“foo”};
snippet.log(scope1.b&&scope1.b.value | | 0);//0
范围1={a:“foo”,b:{};
snippet.log(scope1.b&&scope1.b.value | | 0);//0
scope1={a:“foo”,b:{value:42};
snippet.log(scope1.b&&scope1.b.value | | 0);//42
通常的答案是&&
操作员:
var v1 = scope1.b && scope1.b.value || 0;
…因为与|
一样,&&
是:&&
计算左操作数,如果是假操作数,则将该假值作为其结果;如果左侧操作数值为truthy,&&
计算右侧操作数并将该值作为其结果
因此,如果scope1.b
是未定义的
:
// We start with
scope1.b && scope1.b.value || 0
// which is
undefined && scope1.b.value || 0
// which is
undefined || 0
// which is
0
…但如果scope.b
是一个与对象引用类似的真实值:
// We start with
scope1.b && scope1.b.value || 0
// which is
scope1.b.value || 0
// which is
scope1.b.value // *IF* scope1.b.value is truthy, or
0 // If it isn't
(回想一下,“falsey”值是未定义的,空的,0
,,“
,NaN
,当然,false
,“truthy”值都是其他值。)
例如:
var范围1;
scope1={a:“foo”};
snippet.log(scope1.b&&scope1.b.value | | 0);//0
范围1={a:“foo”,b:{};
snippet.log(scope1.b&&scope1.b.value | | 0);//0
scope1={a:“foo”,b:{value:42};
snippet.log(scope1.b&&scope1.b.value | | 0);//42
明白了!这绝对有帮助!!那么&&是我们用javascript能做的最好的(或最短的代码)对吗?@ChandlerLee:除非你想为它写一个函数,然后做var v1=foo(scope1,“b.value”,0)代码>,这可能有点过头了。:-)我添加了一个这样做的示例。最后两个示例比var v1=scope1.b&&scope1.b.baz&&scope1.b.baz.boz&&scope1.b.baz.boz.value | 0代码>会是…明白了!这绝对有帮助!!那么&&是我们用javascript能做的最好的(或最短的代码)对吗?@ChandlerLee:除非你想为它写一个函数,然后做var v1=foo(scope1,“b.value”,0)代码>,这可能有点过头了。:-)我添加了一个这样做的示例。最后两个示例比var v1=scope1.b&&scope1.b.baz&&scope1.b.baz.boz&&scope1.b.baz.boz.value | 0代码>将是。。。