首页 / 知识

在JavaScript中进行对象文字赋值后是否需要分号?

2023-04-14 02:43:00

在JavaScript中进行对象文字赋值后是否需要分号?

Are semicolons needed after an object literal assignment in JavaScript?

以下代码说明了分配的对象文字,但之后没有分号:

1
2
3
4
var literal = {
    say: function(msg) { alert(msg); }
}
literal.say("hello world!");

这似乎是合法的,并且不会发出警告(至少在Firefox3中)。 这是完全合法的,还是在不允许使用JavaScript的严格版本中?

我特别想知道将来的兼容性问题...我想编写"正确的" JavaScript,所以从技术上讲,如果我需要使用分号,则希望使用它。


从技术上讲,JavaScript在许多情况下都具有分号作为可选项。

但是,作为一般规则,请在任何语句的末尾使用它们。为什么?因为如果您想压缩脚本,它将使您免于无数小时的沮丧。

自动分号插入由解释器执行,因此您可以根据需要将其省略。在评论中,有人声称

Semicolons are not optional with statements like break/continue/throw

但这是不正确的。它们是可选的;实际情况是,行终止符会影响分号的自动插入;这是一个微妙的区别。

这是分号插入的其余标准:

For convenience, however, such semicolons may be omitted from the source text in certain situations. These situations are described by saying that semicolons are automatically inserted into the source code token stream in those situations.


由于它们基于完整的JavaScript解析器,因此在不使用分号的情况下,YUI Compressor和dojo收缩安全功能应该可以很好地工作。但是Packer和JSMin不会。

始终在语句末尾使用分号的另一个原因是,有时您可能会意外地将两个语句组合在一起以创建非常不同的内容。例如,如果您使用通用技术遵循语句以使用闭包创建范围:

1
2
3
4
5
6
var literal = {
    say: function(msg) { alert(msg); }
}
(function() {
    // ....
})();

解析器可能将方括号解释为函数调用,从而导致类型错误,但在其他情况下,它可能导致难以跟踪的细微错误。另一个有趣的事故是,如果下一条语句以正则表达式开头,则解析器可能会认为第一个正斜杠是除号。


JavaScript解释器执行称为"分号插入"的操作,因此,如果没有分号的行有效,则分号将被安静地添加到语句的末尾,并且不会发生错误。

1
2
3
4
5
6
7
8
9
var foo = 'bar'
// Valid, foo now contains 'bar'
var bas =
    { prop: 'yay!' }
// Valid, bas now contains object with property 'prop' containing 'yay!'
var zeb =
switch (zeb) {
  ...
// Invalid, because the lines following 'var zeb =' aren't an assignable value

不太复杂,当某些事情显然不正确时,至少会引发错误。但是在某些情况下,由于分号的插入,不会引发错误,但是语句没有按预期执行。考虑一个应该返回一个对象的函数:

1
2
3
4
5
6
7
8
9
10
11
return {
    prop: 'yay!'
}
// The object literal gets returned as expected and all is well
return
{
    prop: 'nay!'
}
// Oops! return by itself is a perfectly valid statement, so a semicolon
// is inserted and undefined is unexpectedly returned, rather than the object
// literal. Note that no error occurred.

像这样的错误可能非常难以捉摸,尽管您不能确保这种情况永远不会发生(因为我无法关闭分号插入),但是当您通过以下方式使意图清晰时,这些类型的错误就更容易识别始终使用分号。明确地添加分号通常被认为是好的样式。

在阅读道格拉斯·克罗克福德(Douglas Crockford)精湛而简洁的书《 JavaScript:The Good Parts》时,我第一次意识到这种隐患的可能性。我强烈推荐它。


在这种情况下,语句末尾不需要分号。结论是相同的,但是推理还很遥远。

JavaScript没有将分号作为"可选"。相反,它对自动分号插入有严格的规定。分号对于breakcontinuethrow之类的语句不是可选的。有关更多详细信息,请参阅ECMA语言规范。特别是11.9.1,自动分号插入规则。


不需要分号。有些人选择遵循始终以分号终止的约定,而不是允许JavaScript在换行符处自动终止,但是我敢肯定,您会发现支持这两个方向的组。

如果您要编写"正确的" JavaScript,我建议在Firefox中将javascript.options.strict(可通过about:config访问)设置为true。它可能无法捕获所有内容,但可以帮助您确保JavaScript代码更合规。


使用JSLint保持JavaScript整洁

JSLint说:

Error:

Implied global: alert 2

Problem at line 3 character 2: Missing
semicolon.

}


这是无效的(请参阅下面的说明)JavaScript代码,因为赋值只是一个常规语句,与

1
var foo ="bar";

由于JavaScript解释器会尝试添加分号来修复语法错误,因此可以省去分号,但这是一个额外且不必要的步骤。我不知道任何严格的模式,但是我知道自动解析器或压缩器/混淆器需要该分号。

如果要编写正确的JavaScript代码,请写分号:-)

根据ECMAscript规范http://www.ecma-international.org/publications/standards/Ecma-262.htm,如果缺少分号,则会自动插入。这使得脚本作者不需要它们,但是这意味着解释器需要它们。这意味着原始问题的答案是"否",编写脚本时不需要回答,但正如其他人所指出的,出于各种原因建议这样做。


对象文字赋值分配

最新内容

相关内容

热门文章

推荐文章

标签云

猜你喜欢