2017-02-27 59 views
1

目前我正在閱讀你不知道JS系列。使用數組表示法來訪問for..in循環中的對象屬性的目的是什麼?

我無法理解在此代碼是的console.log一條線(K,myObject的[K])

var myObject = { }; 
Object.defineProperty(
myObject, 
"a", 
{ enumerable: true, value: 2 } 
); 
Object.defineProperty(
myObject, 
"b", 
{ enumerable: true, value: 3 } 
); 

for (var k in myObject) { 
console.log(k + ' -> ' + myObject[k]); 
} 

爲什麼作者使用數組符號來訪問對象屬性?

如果我修改這樣[通過對象屬性訪問來訪問對象屬性] 的console.log代碼(K,myObject.k)

我在控制檯得到未定義的值。

如果通過對象屬性訪問器訪問,它顯示爲undefined? 什麼是使用數組如符號訪問對象屬性的目的?

+0

有時你不知道你的對象的關鍵。當像這樣循環時,你可以得到它們並能夠訪問這些值。 – sandrooco

+0

如果屬性名稱是一個變量,那就沒有其他辦法。您只能使用點符號表示文字(不是所有文字,只是那些沒有特殊字符的文字)。 –

回答

3

使用屬性訪問器就像是使用文字:

var obj= { 
 
    prop1: "Hello", 
 
    name: "This is not prop1" 
 
} 
 

 
var prop1="name"; 
 

 
console.log(obj.prop1) 
 
console.log(obj[prop1])

obj.prop1obj["prop1"]幾乎等同(見最後例如,要查找的時候都不能互換),因此,如果您在編寫代碼時不知道屬性名稱是什麼,您需要使用方括號表示法來對其進行參數化:

function getProperty(obj,prop) { 
    return obj[prop]; 
} 

另一個理由使用這個符號使用無效的JS標識符的屬性名時: 鑑於此對象:

var obj= { "hello-world":"text here"} 

下面的表達式是有效的

console.log(obj["hello-world"])

的以下表達式無效,因爲JS會嘗試查找obj.hello的值,然後減去world的值:

console.log(obj.hello-world)

+0

感謝您澄清我的疑惑。 –

1

爲什麼筆者使用數組符號來訪問對象的屬性?

這不是數組表示法。

foo["x"](其中"x"是被評估爲字符串的東西)是如何訪問對象的屬性。

您也可以使用foo.x,但前提是x是標識符。

當值爲數字時,不能使用.x,因爲標識符不能以數字開頭(這就是爲什麼您通常會看到用於訪問數組屬性的方法(這只是一種對象類型)) 。

當值在變量中時(因爲您想評估變量並獲取它的值,不使用`「x」),所以在這裏使用它時不能使用.x

0

如果你看到下面

var myObject = { }; 
 
    Object.defineProperty(
 
    myObject, 
 
    "a", 
 
    { enumerable: true, value: 2 } 
 
    ); 
 
    Object.defineProperty(
 
    myObject, 
 
    "b", 
 
    { enumerable: true, value: 3 } 
 
    ); 
 
    
 
    Object.defineProperty(
 
    myObject, 
 
    "k", 
 
    { enumerable: true, value: 4 } 
 
    ); 
 
    
 
    for (var k in myObject) { 
 
    console.log(k + ' -> ' + myObject.k); 
 
    };

我有一個名爲 'K',並與該另外添加的屬性,將執行console.log輸出 '4',而不是 '未定義' 的代碼。這顯示了JavaScript解釋器如何工作,因爲它在對象中查找鍵名「k」。它不查找存儲在變量k中的值。

相關問題