【问题标题】:Why typing {}==[] in the Chrome console will report an error, and {}=={} will not report an error? [duplicate]为什么在 Chrome 控制台输入 {}==[] 会报错,而 {}=={} 不会报错? [复制]
【发布时间】:2019-07-11 13:35:06
【问题描述】:
{} == []

输出:

Uncaught SyntaxError: Unexpected token ==

在哪里,

{} == {}

输出

【问题讨论】:

  • 好吧,[] == {} 有效。
  • 试试new Object({}) == new Array([]);
  • {} 很可能被解释为代码块,但为什么无论如何要在控制台中键入无意义的表达式..?
  • 看起来是一个控制台的东西。 {} == {} 在普通 JS 中作为独立行抛出
  • 那么为什么下面的{}没有解析成语句块呢?

标签: javascript google-chrome


【解决方案1】:

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

上次编辑:
如果您在行首或关闭语句之后使用{,JavaScript 模拟器将把这个花括号作为代码块的开头。因此,模拟器会将} 视为该块的关闭。这意味着== [] 独自站在您的代码中间...

将其包裹在圆括号中,模拟器会将其转换为 if 语句,然后 { 将被视为 in-the-fly-object 的开头。

例如:

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

编辑:

经过一番快速研究,模拟器出现故障的情况似乎很少见。

使用 Chrome 71:

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

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

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

var b = [] // => literal returns a function that will be executed immediately
{} == b // => false because b holds the result of the executed literal-function.


{} == function() // throws error
{} == [] // throws error
var f = function() { --some code-- }
{} == f // throws error

【讨论】:

  • 为什么 {} == {} 不报告错误?
  • "使用数组字面量 ([]) 将返回一个创建数组的函数" - 呃,不。
  • 顺便说一句,var a = {} 在控制台中生成 undefined
【解决方案2】:

这是因为 {} 没有被解释为一个空对象,而是一个空块。

在 javascript 中使用的大括号是不明确的。它既可以用于定义对象,也可以用于定义块。

例如,下面的代码块不会给你任何错误,因为它只是一个合法的代码块:

{
  console.log('hello world!');
}

所以当你输入{} == [] 时,你是在比较一个空块和一个空数组,这是没有意义的。

当您键入 {} == {} 时,解析器会理解您正在比较两个对象并返回 false。

我猜这只是因为实施而不是因为规范

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2022-12-01
  • 2016-06-05
  • 1970-01-01
相关资源
最近更新 更多