空格字符作为JavaScript中的标点符号

时间:2010-11-03 13:15:08

标签: javascript

在ECMAScript规范(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-262.pdf)的第7.7章(标点符号)中,标点符号的网格似乎在最后一列的第3行中有间隙。这实际上是空格字符标点符号,对吗?

我知道可以在JavaScript代码中的标记之间插入可选空格字符(为了提高可读性),但是,我想知道它们实际上在哪里必需 ......

为了找到这个,我在jQuery库的缩小版本中搜索了空格字符。这些是我的结果:

空格 required ...(参见下面的更新)

...在关键字和标识符之间:

function x(){}
var x;
return x;
typeof x;
new X();

...两个关键字之间:

return false;
if(x){}else if(y){}else{}

这是我发现的两个案例。还有其他案件吗?

注意:字符串文字中的空格字符不被视为标点符号(显然)。

更新: 事实证明,在这些情况下,空格字符。例如,关键字标记和标识符标记必须由 分隔,但某些不必是空格字符。它可以是任何不是令牌的输入元素(WhiteSpaceLineTerminatorComment)。

同样...... 似乎空格字符被视为WhiteSpace输入元素,而不是令牌,这意味着它不是标点符号

3 个答案:

答案 0 :(得分:4)

我不认为差距是一个空间,不,我认为这只是一个差距(一个不幸的差距)。如果他们真的想要列出一个空格,我希望他们使用“ Whitespace ”,因为他们在文档的其他地方。但是作为标点符号的空白并没有真正意义。

我相信空格(和其他形式的空白)是分隔符。规范类型通过省略而不是明确地定义它们。 functionx之间需要空格,因为否则您有令牌functionx,它当然不是关键字(尽管它可能是名称标记 - 例如,变量,属性或函数名称)。

您需要围绕某些令牌(标识符 ReservedWords )的分隔符,因为这就是我们如何识别这些令牌开始和结束的位置 - IdentifierName IdentifierStart 开头,后跟零个或多个 IdentifierParts ,这个类不包含用于标点符号的空格或任何字符。其他令牌(例如 Punctuators )我们可以识别没有分隔符。我认为这是关于它的,所以你的两个规则几乎只是同一规则的两个例子: IdentifierNames 必须被分隔(由空格,标点符号,文件的开头或结尾,... )。

有些偏离主题,但当然并非所有分隔符都是平等的。断行分隔符有时会被“分号插入”的恐怖语法专门处理。

答案 1 :(得分:1)

在任何这些情况下都需要 空格。您只需要编写一个可供解析器理解的语法。换句话说:机器必须知道您使用的是functionnew之类的关键字,还是仅定义另一个变量newFunction

每个关键字都必须以某种方式分隔 - 空格是最明智和可读的,但是它们可以被替换:

return/**/false;
return(false);

答案 2 :(得分:0)

这只是猜测,但我会说实际上并不需要空格。它们被用作在关键字之间生成单词边界的众多替代方案之一。这意味着您也可以用其他字符替换它们。

如果您想要从某些代码中删除不必要的空格,我会说空格(白色空间更精确,标签也可以正常工作)只有在没有其他方法来分隔关键字和/或变量标识符。即通过删除空格,您在结果代码中不再具有相同的关键字和标识符。


以下内容与您的需求并不完全相关,但您可能会发现它很有趣。您可以为您编写示例,以便它们不再具有这些空格。我希望没有一个例子是错的。

x=function(){}而不是function x(){}
this.x=null;代替var x;
return(x);代替return x;
typeof(x);代替typeof x;
y=X();而不是y = new X();
return(false)代替return false
if(x){}else{if(y){}else{}}代替if(x){}else if(y){}else{}