事先声明,关于答案的理解是从网上这道题的回答者理解到的。用来做个人学习记录用
-----------------------------------------------------------------------------------------------------
今天在网上看到一道有趣的题
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"的属性