在Firefox3.5中,我在Firebug控制台中键入以下内容:
false=={} // => evals to false
{}==false // syntax error
对此有何解释?
发布于 2009-10-02 13:56:41
{
在语句的开头表示一个“语句块”(参见ECMA-262-3的12.1节),其中包含一个语句列表。
}
立即结束不包含任何语句的语句块。这很好。但现在解析器正在寻找下一条语句:
==false
哈?这不是一个语句;语法错误。
语句块是用来做什么的?好吧,每次你说:
if (something) {
...
}
JavaScript将这些流控制语句定义为:
if "(" <expression> ")" <statement> [else <statement>]
即。在单语句形式中,不带大括号。然后,它允许您在任何可以使用单个语句的地方使用语句块,这意味着您可以使用if括号多个语句。但这也意味着您可以拥有一个单独的语句块,而无需关联的流控制语句。
这绝对没有实际意义!您可能会认为它为您提供了信息隐藏,但事实并非如此:
var a= 1;
{
var a= 2;
}
alert(a);
2
中的...results,因为语句块本身不会创建新的作用域。
JavaScript以这种方式定义流控制和语句块,因为C(以及从它派生的其他语言)是这样做的。不过,这些语言并没有让{}
作为对象文字表达式提供双重功能,因此它们不存在使这成为另一个JS错误特性的歧义。
即使是这个wannabe-字面:
{
a: 1
}
是一个有效的语句块,因为‘:’用于表示语句中的标签。( 1
是一个无用的表达式语句,省略了分号。)标签是从C继承的另一个特性,在JavaScript中很少使用。它们并不像积木一样完全没有意义,但它们很少被需要,而且经常被认为品味不佳。
(具有两个属性的文本将导致语法错误,因为对象文本使用逗号分隔符,但带标签的语句必须用分号分隔。)
这就是not the only place,它松散的语法可能会让你陷入困境,因为它会对你认为是表达式的东西做一些其他的陈述。
发布于 2012-01-05 15:51:27
简单地说,{}==false
是由Js编译器编译成{};==false
的,所以这是语法错误。你应该写({})==false
,它会返回false。
https://stackoverflow.com/questions/1509535
复制相似问题