Javascript 直接访问空对象{}上的属性时出现语法错误 “[对象编号]”==object.prototype.toString.call(1)/#1 “[对象编号]”=={}.toString.call(1)/#2 {}.toString.call(1)==“[对象编号]”/#3 ({}).toString.call(1)==“[对象编号]”/#4 {}.toString.call(1)/#5 !{}.toString.call(1)/#6 test={}.toString.call(1)/#7
正如您从示例中所看到的,#2和#3几乎相同,只是它们的左侧和右侧互换了#2工作正常,但#3出现语法错误。要使#3起作用,需要一对括号。此外,从#5-7我们可以看到,只要Javascript 直接访问空对象{}上的属性时出现语法错误 “[对象编号]”==object.prototype.toString.call(1)/#1 “[对象编号]”=={}.toString.call(1)/#2 {}.toString.call(1)==“[对象编号]”/#3 ({}).toString.call(1)==“[对象编号]”/#4 {}.toString.call(1)/#5 !{}.toString.call(1)/#6 test={}.toString.call(1)/#7,javascript,syntax,syntax-error,Javascript,Syntax,Syntax Error,正如您从示例中所看到的,#2和#3几乎相同,只是它们的左侧和右侧互换了#2工作正常,但#3出现语法错误。要使#3起作用,需要一对括号。此外,从#5-7我们可以看到,只要{}不在最左边,它就可以正常工作 但是为什么呢 在#1中,当它找到rvalue和运算符=时,javascript认为lvalue可以是一个值或一个表达式 在#2中,与#1相同。因此,{}被视为对象文字 在#3中,由于javascript从右到左对语句求值,{}被认为只是一个大括号,而不是对象文字。因此#3不起作用,因为在花括号上无
{}
不在最左边,它就可以正常工作
但是为什么呢 在#1中,当它找到rvalue
和运算符=
时,javascript认为lvalue
可以是一个值或一个表达式
在#2中,与#1相同。因此,{}
被视为对象文字
在#3中,由于javascript从右到左对语句求值,{}
被认为只是一个大括号,而不是对象文字。因此#3不起作用,因为在花括号上无法获得toString
函数
在#4中,当您将{}
括在()
分组运算符中时,javascript认为它是一个表达式。因此#4起作用是因为{}
作为对象文本进行计算,并且toString
可用
在#5中,与#3相同。javascript认为,{}
只是一个大括号,因为没有表达式或与之配套
在#6中,与#4相同。有一个表达式代码>。因此,被评估为一个对象
在#7中,与#4相同。有一个赋值运算符,因此作为表达式进行求值。我猜{}
是一个对象文字,没有赋值给任何变量,因此它还没有初始化为对象。考虑到{..}
范围的可能性,在这种情况下{}
是块。@Xufox:为什么它是块?如果在控制台中键入“{}”,它将返回“{}”——一个对象。此外,这是在桌面浏览器上测试的,而不是在节点上。它不是一个块,因为在Chrome中,而不是在Firefox中,它抛出了一个错误。Chrome隐式地将所有内容包装在(
…)
中。以前甚至有一个版本,{}+({}
在控制台中是有效的(不确定它是否仍然存在)。在JS中,{}
仍然是一个块。它确实是每个Mozilla文档的一个块:
> "[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]"