2010-05-30 156 views
54

我正在嘗試解決JavaScript對象的屬性名稱有效的問題。例如有效的JavaScript對象屬性名稱

var b = {} 
b['-^colour'] = "blue";  // Works fine in Firefox, Chrome, Safari 
b['colour'] = "green";  // Ditto 
alert(b['-^colour']);  // Ditto 
alert(b.colour);   // Ditto 
for(prop in b) alert(prop); // Ditto 
//alert(b.-^colour);  // Fails (expected) 

post細節有效的javascript變量名,和「 - ^彩」顯然是無效的(作爲變量名)。這同樣適用於對象屬性名稱嗎?綜觀上述,我試圖找出是否

  1. B [「 - ^色」]是無效的,但怪癖在所有瀏覽器的工作原理,我不應該相信它的工作向前發展

  2. b [「 - ^色」]是完全有效的,但它只是那種只能以這種方式訪問​​的形式 - (它支持這樣的對象可以被用作也許映射?)

  3. 東西否則

順便說一句,在JavaScript中的全局變量可以在頂級聲明爲

var abc = 0; 

,但也可以創建(據我所知)與

window['abc'] = 0; 

在以下所有作品上述瀏覽器

window['@£$%'] = "bling!"; 
alert(window['@£$%']); 

這個有效嗎?這似乎與變量命名規則相矛盾 - 或者我沒有在那裏聲明一個變量?變量和對象屬性名稱有什麼區別?

回答

53

是的,對象可以用作地圖,任何字符串都可以是屬性名稱。正如您發現的那樣,某些屬性可以使用括號語法來訪問只有

window['abc'] 

正在訪問一個屬性。這是不是一個變量,即使它指的是相同的值(在全球範圍內)爲:

abc 
+37

「的對象屬性名稱可以是任何有效的JavaScript串,或任何可以被轉換成一個字符串,包括空字符串。然而,任何屬性名不是一個有效的JavaScript標識符(例如,一個包含空格或連字符的屬性名稱或以數字開頭的屬性名稱)只能使用方括號表示法進行訪問。「 ([MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects#Objects_and_properties)) – 2014-02-10 13:51:08

+8

***Márton提出了一個非常重要的觀點***當初,可能看起來好像任何JS對象都可以將任何東西視爲有效的對象鍵,但事實並非如此--Márton正確地指出這些屬性鍵實際上已轉換爲字符串。考慮'var x = new function X(){};','var y = new function Y(){};'和obj = {x:true};''obj [y]'會輸出'true',因爲'x'和'y'在用作對象鍵時都被轉換爲相同的字符串'「[object Object]」 – ChaseMoskal 2014-04-01 20:44:58

+4

爲了清楚起見,根據我以前的評論的例子,'obj [ x] === obj [y] === obj [「[object Object]」]' – ChaseMoskal 2014-04-01 20:47:00

11

對象屬性命名規則和變量的命名規則是分開的。該標準僅「保留」了一些財產名稱(例如prototypeconstructor,IIRC),但除此之外,任何字符串都會發送。

當然,除了執行環境(即瀏覽器)決定添加更多魔術屬性。 (我聽到設置__proto__突破一些東西很奇怪的方式)

+0

感謝馬蒂 - 很難找出答案的答案,都回答了,但是有不同的(有用的)信息 - 回答。乾杯。 – hawkett 2010-05-30 21:54:37

+1

當你將'__proto__'設置爲null時,除了原型鏈之外還有什麼斷開(所以它是一個更快的屬性查找),如果你需要它作爲值對的簡單哈希表? – 2011-06-01 11:58:01

6
  1. 你實際上創建全局對象(這是window在瀏覽器環境中,global中的新成員,每次你創建一個全局變量Node.js等)。這就是爲什麼window.x與(全球)var x,this.x或僅僅x完全相同。

  2. 瞭解JavaScript 對象像地圖是非常正確的,因爲:a)您可以隨時動態添加新元素; b)元素可以具有任何名稱 - 也包括特殊字符,c)可以嘗試訪問對象/地圖中不存在的元素,這不是錯誤,d)可以從對象中移除元素。

  3. 如果你喜歡訪問對象成員標準點符號(如:a.x)您沒有被允許使用不同於任何特殊字符_或$;該名稱也不能從數字開始。對於所有其他情況,您不得不使用方括號和引號來訪問對象元素。