javascript - 对象文字比较的奇怪行为

标签 javascript google-chrome

我已搜索但无法找到 JavaScript 中跟随背后的逻辑。

当我在 Chrome 控制台中输入时:

{} == null 

返回

Uncaught SyntaxError: Unexpected token ==

但是

{} == {}

{} == function(){} 

返回错误

为什么?

最佳答案

我假设您理解为什么 {} == null 会抛出 SyntaxError。长话短说,这是因为 { 一开始是 block 语句而不是对象文字。你可以查看答案 here

至于为什么 {} == {} 这行得通。

如果您检查在控制台中计算表达式的 Chrome 代码。您可以找到以下内容 ( code )

if (/^\s*\{/.test(text) && /\}\s*$/.test(text))
    text = '(' + text + ')';
executionContext.evaluate(text, "console", !!useCommandLineAPI, false, false, true, printResult);

此代码用括号包裹 {} == {} 代码,使其成为比较两个空对象文字的有效表达式 ({} == {})。其计算结果为 false,因为对象是通过引用进行比较的。

节点 repl 具有相同的行为 src

if (/^\s*\{/.test(code) && /\}\s*$/.test(code)) {
  // It's confusing for `{ a : 1 }` to be interpreted as a block
  // statement rather than an object literal.  So, we first try
  // to wrap it in parentheses, so that it will be interpreted as
  // an expression.
  code = `(${code.trim()})\n`;
  wrappedCmd = true;
}

关于javascript - 对象文字比较的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50989247/

相关文章:

javascript - 如何插入多维关联数组

javascript - 根据我悬停的按钮移动相同的图像

javascript - 将值从一个页面传递到另一个

javascript - 与 React hooks 的 setState 回调等效

javascript - 端口错误 : Could not establish connection. 接收端不存在

javascript - 在 JQuery 中重用 PHP 代码并通过引用传递问题的排列

javascript - 如何在 Chrome 扩展中使用给定的字符/键码初始化键盘事件?

javascript - 线下优先!无法将 Chrome 扩展代码注入(inject)离线页面

javascript - 延迟脚本直到所有消息都已通过?

html - 如何设置<select>的高度