> "[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我们可以看到,只要{}
不在最左边,它就可以正常工作。
但为什么呢?
答案 0 :(得分:0)
在#1中,当找到rvalue
和运算符===
时,javascript认为lvalue
可以是值或表达式。
在#2中,与#1相同。因此{}
被视为对象文字
在#3中,由于javascript从右到左评估语句,{}
被视为大括号,但不是对象文字。因此#3没有用,因为你在花括号上没有获得toString
功能。
在#4中,当您将{}
括在()
分组运算符中时,javascript认为它是一个表达式。因此#4有效,因为{}
被评估为对象文字并且toString
可用。
在#5中,与#3相同。 javascript认为{}
只是一个大括号,因为没有表达式或者它。
在#6中,与#4相同。有一个表达式!
。因此被评估为对象
在#7中,与#4相同。有一个赋值运算符,因此被计算为表达式。