鍍金池/ 問答/HTML/ JavaScript中,非數(shù)組的對象為什么也可以用Obj["Index

JavaScript中,非數(shù)組的對象為什么也可以用Obj["Index"]來訪問屬性呢?

根據(jù)MDN的屬性訪問器可知:
對象可以使用 obj.propertyName / obj["propertyName"]來訪問屬性。

而數(shù)組的屬性,可以通過下標來訪問。(來源忘了,反正就是知道)
但我發(fā)現(xiàn):對于非數(shù)組對象,也可以使用下標來訪問對象的屬性(盡管這個下標我也不知道是什么,就是亂寫的),這是為什么呢?

var a = [],i = 0;
var obj={
    a:12,
    b:34.56,
    c:true,
    d:"hello",
    e:null,
    f:undefined,
    g:{}
};
   
for (a[i] in obj) {
  console.log("a[" + i + "]=" + a[i] + ",obj[" + i + "]=" + obj[a[i]]);
  i++;
} 

輸出如下:

a[0]=a,obj[0]=12
a[1]=b,obj[1]=34.56
a[2]=c,obj[2]=true
a[3]=d,obj[3]=hello
a[4]=e,obj[4]=null
a[5]=f,obj[5]=undefined
a[6]=g,obj[6]=[object Object]

回答
編輯回答
莓森
對象可以使用 obj.propertyName / obj["propertyName"]來訪問屬性。
而數(shù)組的屬性,可以通過下標來訪問
對于非數(shù)組對象,也可以使用下標來訪問對象的屬性

這三句話都沒錯,其實核心就第一句話。

對象可以使用 obj.propertyName / obj["propertyName"]來訪問屬性。

因為數(shù)組是對象,所以

數(shù)組可以使用 obj.propertyName / obj["propertyName"]來訪問屬性。

但是因為propertyName 需要是字符串,所以arr.1會報錯,這種情況下,就要用第二種, obj["propertyName"],在這里就是arr['1'],當然arr[1]也是可以的,因為[]里的內(nèi)容如果不是字符型會被自動轉(zhuǎn)為字符型,如果是變量就會求值,然后轉(zhuǎn)為字符型。

基礎知識看JavaScript權(quán)威指南-第6版-中-掃描版-補吧,網(wǎng)上的知識七七八八,參差不齊,沒必要看。

2018年8月28日 22:23
編輯回答
巫婆

使用屬性表達式訪問屬性,這句話?

2018年6月9日 09:53
編輯回答
離魂曲

終于找到這個知識點的出處了,見這里

對象屬性索引

在 JavaScript 1.0 中,你可以通過名稱或序號訪問一個屬性。但是在 JavaScript 1.1 及之后版本中,如果你最初使用名稱定義了一個屬性,則你必須通過名稱來訪問它;而如果你最初使用序號來定義一個屬性,則你必須通過索引來訪問它。

這個限制發(fā)生在你通過構(gòu)造函數(shù)創(chuàng)建一個對象和它的屬性(就象我們之前通過 Car 對象類型所做的那樣)并且顯式地定義了單獨的屬性(如 myCar.color = "red")之時。如果你最初使用索引定義了一個對象屬性,例如 myCar[5] = "25",則你只可能通過 myCar[5] 引用它。

這條規(guī)則的例外是從與HTML對應的對象,例如 forms 數(shù)組。對于這些數(shù)組的元素,你總是既可以通過其序號(依據(jù)其在文檔中出現(xiàn)的順序),也可以按照其名稱(如果有的話)訪問它。舉例而言,如果文檔中的第二個 <form> 標簽有一個 NAME 屬性且值為 "myForm",訪問該 form 的方式可以是 document.forms[1],document.forms["myForm"]或 document.myForm。

var myCar=new Object();
myCar.make="Ford";
myCar.model= "Mustang";
myCar.year = 1969;
myCar["hum"] = 100;
console.log(myCar["0"]);
console.log(myCar["1"]);
console.log(myCar["2"]);
console.log(myCar["hum"]);
console.log(myCar.hum);
2017年8月10日 17:27
編輯回答
晚風眠

訪問對象的屬性的方法有兩種:

  1. Obj.attr
  2. Obj[attr]

有時候第一種是沒辦法執(zhí)行的,我舉個栗子:

clipboard.png

所以,提供了第二種方法來獲取屬性的值。

2017年12月20日 04:13