Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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 直接访问空对象{}上的属性时出现语法错误 “[对象编号]”==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不起作用,因为在花括号上无

正如您从示例中所看到的,#2和#3几乎相同,只是它们的左侧和右侧互换了#2工作正常,但#3出现语法错误。要使#3起作用,需要一对括号。此外,从#5-7我们可以看到,只要
{}
不在最左边,它就可以正常工作

但是为什么呢

在#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]"