js中括號內的字符串加不加引號的影響


事先聲明,關於答案的理解是從網上這道題的回答者理解到的。用來做個人學習記錄用

-----------------------------------------------------------------------------------------------------

今天在網上看到一道有趣的題

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"的屬性


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM