2010-08-31 67 views
15

我bumbed進入這些時刻,當我剛剛失去了重心,開始琢磨在一個愚蠢的問題之一:JavaScript中「keys」的類型是什麼?

var a = { 
    b: "value" 
} 

什麼是typeof運算「B」,我並不意味着將typeof「價值」,但實際的鍵標記爲b?

背景: 我開始思索着,我不得不創建一個關鍵這是一個字符串:因爲它是作爲參考稍後

var a = { 
    "b": "value" 
} 

a["b"] 

然後不知道原來的問題。

回答

18

在對象字面而言,b是一個屬性。屬性是JavaScript中的字符串,但在對象文本中定義屬性名稱時,可以省略字符串分隔符。

當通過使用for...in屬性名稱循環,屬性名是一個字符串:

for (key in a) { 
    alert(typeof key); 
    //-> "string" 
} 
+0

那麼現在我開始想知道'鑰匙'是一個字符串,只有當你循環的鑰匙? - 但我想這取決於JavaScript引擎的實現。 – tunylund 2010-08-31 11:11:27

+0

@tunylund:沒有密鑰總是一個字符串。我在下面的答案中給出了一些例子:) – 2010-08-31 11:16:34

+1

@tunylund:正如@Daniel所說,密鑰總是一個字符串。由於沒有真正的用例來測試一個對象的鍵的類型(不是鍵的值),並且除了像這樣循環枚舉鍵之外沒有辦法做到這一點,所以這不是你應該擔心的事情:) – 2010-08-31 11:23:57

2

b是字符串,它只是一個速記語法,所以你寫

var a = { 
    b: "value" 
} 

,而不是

var a = { 
    "b": "value" 
} 
2

記住JavaScript對象是哈希表和鑰匙都只是字符串。您可以在聲明期間忽略屬性名稱周圍的引號,但是如果您使用保留字來表示屬性名稱或任何其他恰巧是無效標識符的名稱(例如以數字開頭或包含空格),則必須包裝屬性名稱引號:

var a = { 
    "1b":  "value", 
    "b and c": "value", 
    "+12345": "value" 
}; 

另外請注意,您可以參考使用點符號或標符號對象的屬性,無論是否在那裏他們被宣佈時使用引號。但是,如果您使用屬性名稱,這將是無效的標識符,如在上面的例子中的,你不得不使用下標符號:

a.1b    // invalid (dot notation) 
a["b and c"]; // valid (subscript notation) 
+0

這些無效標識符是否適用於所有(主要)瀏覽器?你有沒有冒險在一些JavaScript引擎中拋出異常? – 2010-08-31 11:06:17

+1

@Marcel:下標符號由ECMA-262規範定義,任何字符串都是有效的。 – 2010-08-31 11:08:20

+0

@Marcel:是的,他們應該在所有瀏覽器中工作。對象是散列表,並接受任何字符串作爲鍵(屬性名稱)。道格拉斯克羅克福德在這裏描述了這個話題(部分對象):http://www.crockford.com/javascript/survey.html – 2010-08-31 11:11:23

8

屬性名稱被自動強制轉換爲字符串。您可以使用數字文字作爲屬性名稱來嘗試。

var object = { 
    .12e3: 'wut' 
}; 
object[.12e3]; // 'wut' 
object['.12e3']; // undefined 
object['120']; // 'wut' 

// Let’s try another numeric literal: 
object = { 
    12e34: 'heh' 
}; 
object[12e34]; // 'heh' 
object['12e34']; // undefined 
object[1.2e35]; // 'heh' 
object['1.2e35']; // undefined 
object[1.2e+35]; // 'heh' 
object['1.2e+35']; // 'heh' 

因此,我建議只使用字符串文字作爲屬性名稱。

Unquoted property names/object keys in JavaScript,關於這個問題我寫了:如果屬性名稱是數字文字或a valid identifier name

行情只能被省略。

[...]

括號標記可安全地用於所有屬性名。

[...]

圓點符號可以被當屬性名稱是有效的標識符名稱使用。

我也做了一個工具,它會告訴你,如果任何給定的屬性名稱可以使用不帶引號和/或點表示法。嘗試在mothereff.in/js-properties

Screenshot

0

var a = {$ : 'hello', 2123 : 'number'}; 
 
for(var key in a) { 
 
    console.log(typeof key) 
 
}

密鑰在javascript對象可以是字符串和符號。符號是javascript中的一種原始數據類型。