首页 > 技术文章 > js中括号内的字符串加不加引号的影响

joshtao 2017-03-23 15:55 原文

事先声明,关于答案的理解是从网上这道题的回答者理解到的。用来做个人学习记录用

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

今天在网上看到一道有趣的题

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

推荐阅读