2013-07-16 82 views
2

比方說,我有一個對象:JS相當於C++ .AT()

var foo = {'bar1': {'baz1':1}}; 

我嘗試訪問foo['bar2']['baz2']。如果我只是想訪問foo['bar2'],JS會返回undefined。但是因爲我想未定義bar2後獲得一個屬性,JS拋出TypeError: Cannot read property 'baz2' of undefined.

是否有,首先檢查是否存在foobaz2試圖調用它的屬性對象之前一些自動訪問?我知道我可以使用try/catch塊或if語句,但是我希望沿着C++的array::at這一行發佈函數,它會檢查我。

+0

看看:http://stackoverflow.com/questions/237104/array-containsobj-in-javascript – Avitus

+4

'if(foo ['bar2']){...}'? – Ford

+0

@Avitus不是隻適用於數組的'indexOf'? – user2000008

回答

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 
+0

好吧,太糟糕了,它不是已經內置。謝謝,這就是我所追求的。 – user2000008

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中的對象)。

+0

這些對if(foo [「bar2」]){}有什麼好處。 。 .'? – talemyn

+2

if(foo [「bar2」])'如果映射爲'false','''''','0'或'NaN',可能會虛假地失敗。通常,你只是想看看是否定義了某些東西,但是使用這個模式評估foo [「bar2」]的*真實性,而不是它是否被定義。 –

+1

啊,我明白你的意思了。 。 。所以如果出於某種原因(並且在這個例子中,它看起來會是非常意外的),那麼該對象是'var foo = {「bar2」:false}',它會返回'false',拋出檢查「定義」。 Gotchya。 。 。謝謝。 :) – talemyn

2

請記住,這是隻能爲對象,就像一個你所顯示的,而不是陣列(即[0,1,2]),但我最喜歡的是這個:

if ('bar1' in foo) 

這是即使對HTML5功能檢測也很有用。

if ('localStorage' in window) 

我可以給你一個數組,但我覺得比較合乎邏輯的是將其長度與給定索引進行比較。並且...不將未定義的值插入到數組中。你知道嗎。 = P

0

foo['bar2'] && foo['bar2']['baz2']會做的伎倆也。