標籤:
Tip: 內容摘抄自《JavaScript權威指南》,看過該書的同學可以忽略本文。
存取一個對象的屬性的方式:
obj.attr;
obj["attr"];
兩者最重要的區別就是前者的屬性名稱是標示符,後者的屬性名稱是一個字串。
用"."運算子來存取一個對象的屬性時,屬性名稱是標示符,JavaScript程式中,標示符必須被逐字輸入,它們不是一種資料類型,因此程式不能對他們進行操作。
用數組的概念"[]"來存取一個對象的屬性時,屬性名稱是用字串表示的。字串是JavaScript的一種資料類型,因此可以在程式啟動並執行過程中操作並建立他們。
關聯陣列
obj["attr"];
如果使用一個對象是採用的是這種形式,我們常常稱它為關聯陣列。關聯陣列是一種資料結構,允許你動態將任意的數值和任意的字串關聯在一起。實際上,JavaScript對象的內部實現就是關聯陣列。
應用情境(obj["attr"])
當你需要編寫一個程式,允許yonghu輸入他所擁有的股票的名字和相應的份額來計算使用者在股票市場投資的當前值,你可以這樣做。
使用一個portfolio對象來儲存這些資訊,使用者輸入的每隻股票的名字作為該對象的一個屬性,其值為該支股票擁有的份額。例如:使用者擁有Netscape公司的股票,份額為50,就有portfolio.nscp = 50;
這個程式需要一個迴圈,首先提示使用者輸入股票名,然後輸入他擁有的份額。
由於使用者在程式運行時輸入股票名(portfolio對象的屬性),所以你無法預Crowdsourced Security Testing道這些股票名是什麼,所以在編程時不能使用"."運算子的方式,但可以使用"[]"關聯陣列的方式,因為他的屬性名稱是一個字串,程式運行時可以動態建立。
下面是具體的代碼
(function(){var portfolio = {};var name,value,sum=0;//定義股票名/份額/投資當前值(總金額)while(true){//輸入股票名和份額並寫入到portfolio對象中if(!(name = prompt("請輸入一支股票名","nscp") || false))break;if(!(value= prompt("請輸入您擁有的份額",50) || false))break;portfolio[name] = +value;}for(e in portfolio){//遍曆計算投資當前值(總金額) sum +=portfolio[e]*1;//假設每支股票都是1元, 每支股票數量*股票價格}console.log(sum);//輸出})();
由於股票名是未知的,如果沒有for/in迴圈,我們不能編寫出這樣的代碼,輸出屬性名稱並計算結果。這是將屬性名稱從portfolio對象中抽取出來的唯一方法
注意:
for(e in portfolio){ sum +=portfolio[e]*1;}
中,e得到的只是portfolio的屬性名稱,並不是屬性名稱對應的屬性值,所以 ”portfolio[e]“ 的寫法是必要的
除此之外,你還可以看看這篇文章,內容差不多 [匯入]js 關聯陣列 詳解
JavaScript對象之關聯陣列