在空对象{}上直接访问属性时出现语法错误

时间:2016-10-10 07:54:47

标签: javascript syntax syntax-error

> "[object Number]" === Object.prototype.toString.call(1) // #1
< true
> "[object Number]" === {}.toString.call(1)               // #2
< true
> {}.toString.call(1) === "[object Number]"               // #3
< SyntaxError: Unexpected token '.'
> ({}).toString.call(1) === "[object Number]"             // #4
< true
> {}.toString.call(1)                                     // #5
< SyntaxError: Unexpected token '.'
> !{}.toString.call(1)                                    // #6
< false
> test = {}.toString.call(1)                              // #7
< "[object Number]"

从样本中可以看出,除了左右两侧交换外,#2和#3几乎完全相同。 #2工作正常,但#3给出了语法错误。要使#3工作,需要一对括号。另外,从#5-7我们可以看到,只要{}不在最左边,它就可以正常工作。

但为什么呢?

1 个答案:

答案 0 :(得分:0)

在#1中,当找到rvalue和运算符===时,javascript认为lvalue可以是值或表达式。

在#2中,与#1相同。因此{}被视为对象文字

在#3中,由于javascript从右到左评估语句,{}被视为大括号,但不是对象文字。因此#3没有用,因为你在花括号上没有获得toString功能。

在#4中,当您将{}括在()分组运算符中时,javascript认为它是一个表达式。因此#4有效,因为{}被评估为对象文字并且toString可用。

在#5中,与#3相同。 javascript认为{}只是一个大括号,因为没有表达式或者它。

在#6中,与#4相同。有一个表达式!。因此被评估为对象

在#7中,与#4相同。有一个赋值运算符,因此被计算为表达式。