Javascript 为什么{}==false会引发异常?
在IE和Chrome中,在JavaScript控制台中键入此命令会引发异常:Javascript 为什么{}==false会引发异常?,javascript,exception,truthiness,Javascript,Exception,Truthiness,在IE和Chrome中,在JavaScript控制台中键入此命令会引发异常: {} == false // "SyntaxError: Unexpected token ==" 但是,所有这些语句的评估都没有问题: false == {} // false ({} == false) // false var a = {}; a == false // false 这是故意的行为吗?为什么会发生这种情况?在控制台中,当您使用{}启动语句时,您不是在创建一个对象文字,而是在创
{} == 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在控制台中选择code>,然后查看a
、b
和c
的值。这至少可以追溯到C语法规则,它允许独立的代码块。谢谢你的回答。你帮我省了点睡眠时间。我想那应该是“用…开始一个声明”,但否则你就太棒了。