为什么在Chrome控制台中输入{} == []会报告错误,而{} == {}不会报告错误?

时间:2019-02-18 07:58:19

标签: javascript google-chrome

{} == []

输出:

  

未捕获的SyntaxError:意外令牌==

位置

{} == {}

输出

  

false

2 个答案:

答案 0 :(得分:0)

显然,这是“坚持您的第一个想法”的示例!

最后修改:
如果在行的开头或在封闭的语句之后使用{,则JavaScript模拟器会将其花括号作为代码块的开头。因此,仿真器会将}视为该块的关闭。这意味着== []独自站在代码中间...

将其包装在圆括号中,模拟器会将其转换为if语句,然后将{视为飞中对象的开头。

例如:

({} == []) // => false

<罢工> 编辑:

经过一些快速研究,看来这是一种罕见的情况,模拟器会失败。

使用Chrome 71:

如果您在控制台var a = {}中键入,则输出为{}。因此创建了一个变量a,创建了一个空对象并将其存储到a中。

但是,如果您键入var b = [],则输出为undefined。这里的仿真器很混乱,因为如果您键入b,则输出为[]。 这意味着创建了变量b,创建了一个数组类型的对象并将其存储到b中。但是使用数组文字的数组创建的返回对象是未定义的。

进一步的测试表明,{} == function()会抛出相同的错误:Uncaught SyntaxError: Unexpected token ==
这让我认为,认为使用数组文字({{1} })将返回创建数组的函数。

[]

答案 1 :(得分:0)

发生这种情况是因为web不会被解释为空对象,而是被解释为空块。

javascript中大括号的用法不明确。它既可以用来定义对象,也可以用来定义块。

例如,以下块不会给您任何错误,因为它只是合法的代码块:

network_mode: host

因此,当您键入{}时,您正在将一个空块与一个空数组进行比较,这没有任何意义。

当您键入{ console.log('hello world!'); } 时,解析器将理解您正在比较两个对象,并且返回false。

我猜这只是因为实现而已,而不是由于规范