> "[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中,当它发现rvalue
和一个操作员===
, javascript 认为lvalue
可以是一个值或一个表达式。
在#2 中,与#1 相同。因此{}
被视为对象字面量
在 #3 中,由于 javascript 从右到左计算语句,因此{}
被视为只是大括号而不是对象文字。因此 #3 不起作用,因为你不会得到toString
花括号上的函数。
在#4中,当你附上{}
within ()
分组运算符,javascript认为它是一个表达式。因此 #4 有效,因为{}
被评估为对象文字并且toString
能得到的。
在#5 中,与#3 相同。 JavaScript 认为{}
只是一个大括号,因为没有表达式或与之一起。
在#6 中,与#4 相同。有一个表达!
。因此被评估为一个对象
在#7中,与#4相同。有一个赋值运算符,因此被评估为一个表达式。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)