事先聲明,關於答案的理解是從網上這道題的回答者理解到的。用來做個人學習記錄用
-----------------------------------------------------------------------------------------------------
今天在網上看到一道有趣的題
var arr = [1,2,3,4]; arr[name] = "aaa"; console.log(arr[length]); //1 console.log(arr.length); //4 console.log(arr[""]); //aaa
首先我們看到第二行心里就感到怪怪的是吧,因為正常的用法是arr["name"] = "aaa"。給arr這個對象添加name這個屬性並且賦值為aaa。
暫且拋開第二行不談。
然后第三行也是和第二行一樣的問題,正確寫法是arr["length"],假如是正確的寫法那么arr["length"] = 4是毫無疑問的。不過題目中少了雙引號,但是少了雙引號為什么從4變成1了呢?
首先我們知道平時訪問一個對象的屬性一般有兩種方法,一種是arr["屬性名"]或者arr.屬性名這樣來方法。
而且中括號arr["屬性名"]這種方法比arr.屬性名多了一種用途,就是可以使用變量代替屬性名。
看到這你應該明白的差不多了吧。
當程序訪問到arr[length]時,看到length沒加引號,很直接的將其當成變量處理而不是字符串。
於是呢在當前作用域尋找length這個變量。不過我們也知道length是關鍵字,和name、class什么的一樣,所以呢是無法找到length這個變量的。
通過chrome控制台我們可以觀察到arr的原型
為什么不報錯說undefined呢,因為會尋原型找到屬性length。值為0。所以arr[length]會被替代為arr[0]。那么也自然是1了。
回到第二行,同理,name也被當做變量處理。而這時候會尋着原型找,在原型中值為“”(此處我也不是確定怎么回事,以后學到了再補充,可能是沒有的屬性默認為""?)。
所以arr對象添加了一個鍵為"",值為"aaa"的屬性