Javascript 为什么{}==false会引发异常?

Javascript 为什么{}==false会引发异常?,javascript,exception,truthiness,Javascript,Exception,Truthiness,在IE和Chrome中,在JavaScript控制台中键入此命令会引发异常: {} == false // "SyntaxError: Unexpected token ==" 但是,所有这些语句的评估都没有问题: false == {} // false ({} == false) // false var a = {}; a == false // false 这是故意的行为吗?为什么会发生这种情况?在控制台中,当您使用{}启动语句时,您不是在创建一个对象文字,而是在创

在IE和Chrome中,在JavaScript控制台中键入此命令会引发异常:

{} == false   // "SyntaxError: Unexpected token =="
但是,所有这些语句的评估都没有问题:

false == {}   // false

({} == false) // false

var a = {};
a == false    // false

这是故意的行为吗?为什么会发生这种情况?

在控制台中,当您使用
{}
启动语句时,您不是在创建一个对象文字,而是在创建一个代码块(即,与使用
if
语句或循环体生成的块相同)。之后显然不需要像
=
这样的符号

如果你想到一个代码块,你就会知道像
a=5可能在它之后出现:

if (some_condition) {
    // do something
}
a = 5;
然后,您可以使用它在控制台中进行测试,并发现它工作正常:

{} a = 5;

另一个奇怪之处:[]==false//true@DexterW我正在仔细阅读。令人困惑的东西。奇怪的是,
[]==false
让我很困惑,但我觉得我以前见过它。编辑:数组的
toString
方法被秘密调用,生成
'
,这是错误的!相应地,
[]=''
真的
。为什么
函数a(){b:1}
不抛出异常?@torazaburo我想知道。这非常非常有趣。所以让我说清楚。我知道JavaScript函数、数组和对象非常相似。您几乎可以在任何内容上添加属性/函数。代码块(
{…}
)的感知是否不同?为什么不能将代码块与对象进行比较?或者这就是问题所在?@Jonn代码块不是任何类型的对象或数据模型。它只是语言语法,仅此而已,旨在显示代码的内联逻辑分离。这里很奇怪,因为在
函数(
)时,将代码块与任何类型的语言结构(如
if
for
)不关联是合法的。例如,尝试
a=5;{b=6;}c=7,然后查看
a
b
c
的值。这至少可以追溯到C语法规则,它允许独立的代码块。谢谢你的回答。你帮我省了点睡眠时间。我想那应该是“用…开始一个声明”,但否则你就太棒了。