JS相当于C ++ .at()

时间:2013-07-16 16:58:10

标签: javascript

假设我有一个对象:

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一致的函数来检查我。

4 个答案:

答案 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']也可以做到这一点。