var map = {};
map[0] // undefined
map['0'] //undefined
map['asdf'] //undefined
上面代码是正常,但下面这段代码并不理解
{}[0] //[0]
{}['0'] //["0"]
{}['asdf'] //["asdf"]
求解惑
var map = {};
map[0] // undefined
map['0'] //undefined
map['asdf'] //undefined
上面代码是正常,但下面这段代码并不理解
{}[0] //[0]
{}['0'] //["0"]
{}['asdf'] //["asdf"]
求解惑
其实{}[0]这种写法与{};[0]
这种写法是一样的,而
var map = {};
map[0] // undefined
map['0'] //undefined
map['asdf'] //undefined
在这里,map不是单纯的就替代为{},而会根据后面的[]尝试将其解析为一个数组。
我也是初学者,无法给答主说清楚其间的细节。
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答5.2k 阅读✓ 已解决
1 回答3.4k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
大括号在js中有两种含义,一个是
对象字面量
,还有一个就是代码块
。对象字面量
存在于表达式中,所以当该语句按照表达式方式解析的时候,大括号就会被当作是对象字面量
。怎样才能被识别为表达式呢?
只要当前语句含有运算符就行了,含有运算符的语句一定是表达式。
就比如你上面的那段。含有
=
运算符,那么这个大括号就被当作对象字面量
了。还有就是JSON形式的大括号也会当作对象字面量来解释。比如:
除开这两种方式之外,大括号都会被当作是
代码块
。在你下面的语句中,大括号之间啥都没有,其实就相当于是空的。
{}[0]
直接等效于[0]
。想要
{}[0]
中的大括号按照对象来解析,加上对运算结果没有影响的运算符就行了:最后再提几句,
[]
也是运算符(成员访问运算符)啊,为什么{}[0]
没有按照表达式方式解析呢。因为
[]
也是有两个意思的,一个就是刚才提到的访问成员运算符
,还有一个是数组字面量
。上面提到了,在语句中没有运算符时,
{}
被当作了代码块,所以{}[0]
是等效于[0]
的,这是从效果上说的,从语句形式上来说,等效成这样{};[0]
更为准确点。这样就能很明显的看到,
[0]
是独立成为一个语句的,当然只能当作是数组字面量
了。{}[0]
返回的那个数组,就是这个语句右边那个数组。