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将是。。。