2013-08-28 72 views
4

我的第一個問題在這裏,需要幫助瞭解JavaScript中的for循環。javascript for ...在循環中請詳細解釋

當我運行下面的代碼我從報警功能「未定義」:

var o = { 
    a: "property 1", 
    b: "property 2", 
    c: "property 3", 
    d: "property 4" 
} 

for (p in o) { 
    alert(o.p); 
} 

,但如果我要改變.[ ]預期(即alert(o[p]))警報將返回屬性值。

爲什麼我不能使用.來訪問對象屬性?

+3

因爲它無法知道您想使用變量'p'而不是名爲'p'的屬性。因此''。'運算符專用於屬性標識符的名稱*(不管它們是否存在)*,而'[]'用於將任何表達式的結果用作屬性名稱。 –

回答

1

如果你把這個細看在循環:

var obj = { 
    a: "property 1", 
    b: "property 2", 
    c: "property 3", 
    d: "property 4" 
} 
for (var prop in obj) { 
    if (typeof(prop) == 'string') { 
     console.log('This is a string!'); 
    } 
} 

你會發現什麼,在環是給你的是屬性的名稱。 這就是爲什麼可以使用obj[prop],因爲該屬性是一個字符串,並且這是訪問對象屬性的合法途徑。

當您嘗試並執行obj.prop時,它會給您未定義,因爲屬性是表示屬性名稱的字符串,它不是實際屬性。

+1

太棒了,我現在明白了,道具是一個字符串,因此就像說道具「道具」,這是不合法的。 obj [「道具」]是合法的。 – James

2
o[p] 

是數組o中的第p個元素。

o.p 

是陣列O,其被正確地報告爲不確定的,因爲它不存在的屬性頁。

3

想象一下,你有這樣的對象:

var o = { 
    a: "property 1", 
    b: "property 2", 
    c: "property 3", 
    d: "property 4", 
    p: "property 5" 
} 

,並運行以下命令:

for (p in o) { 
    console.log(o.p); 
} 

的結果將是:

property 5 
property 5 
property 5 
property 5 
property 5 

因爲o.p意味着你想要得到的名爲p的房產的價值。

同樣在您的示例中,屬性p未在您的對象中定義。

如果要通過字符串獲取屬性的值,則必須使用[]表示法。

2

o.p表示o的財產「p」。

o [「p」]表示同樣的事情。

o [x]表示o的某些屬性(其值由變量x定義)。

o [p]相同。