假设我有一个对象:
var foo = {'bar1': {'baz1':1}};
我尝试访问foo['bar2']['baz2']
。如果我只是想访问foo['bar2']
,JS会返回undefined
。但是因为我试图在未定义bar2
之后获取下一个属性,JS抛出TypeError: Cannot read property 'baz2' of undefined.
对象是否有一些自动访问器,在尝试调用其属性之前首先检查baz2
中是否存在foo
?我知道我可以使用try / catch块或if语句,但我希望有一个与C ++ array::at
一致的函数来检查我。
答案 0 :(得分:2)
请记住,这仅适用于您所显示的对象,而不适用于数组(即[0,1,2]),但我最喜欢的是:
if ('bar1' in foo)
这对于HTML5特征检测甚至有用。
if ('localStorage' in window)
我也可以给你一个数组,但我觉得将它的长度与给定的索引进行比较更合乎逻辑。并且......不要将未定义的值插入数组中。你知道吗。 = P
答案 1 :(得分:2)
你可以很容易地写自己的:
function at(obj, property) {
var props = property.split('.');
for(var i = 0; i < props.length; i++) {
if (typeof obj === 'undefined') {
return;
}
obj = obj[props[i]];
}
return obj;
}
var foo = {'bar1': {'baz1':1}};
console.log(at(foo, 'bar1.baz1'));
// => 1
console.log(at(foo, 'bar2.baz2'));
// => undefined
答案 2 :(得分:1)
您可以使用in
运算符:
if("bar2" in foo) {
//do stuff with foo['bar2']
}
或者您可以查看foo['bar2']
是否为undefined
:
if(typeof foo['bar2'] !== "undefined") {
//do stuff with foo['bar2']
}
此外,您正在使用的是对象而不是数组(嗯,它们是关联数组,但也是JavaScript中的对象)。
答案 3 :(得分:0)
foo['bar2'] && foo['bar2']['baz2']
也可以做到这一点。