javascript - 关键字和文字之间需要空格

标签 javascript syntax whitespace

查看 UglifyJS2 的输出,我注意到文字和 in 运算符之间不需要空格(例如,'foo'in{foo:'bar'} 有效)。

然而,在使用 Chrome 的 DevTools 时,我注意到十六进制和二进制数字文字在 in 关键字之前需要一个空格:

enter image description here

Internet Explorer 对所有三个测试都返回 true,而 FireFox 48.0.1 对第一个测试抛出 SyntaxError (1in foo),但是字符串文字 ('1'在 foo==true).

似乎解析 JavaScript 应该没有问题,允许关键字紧挨着数字文字,但我在 ECMAScript 规范中找不到任何明确的规则(其中任何一个)。

进一步的测试表明像 for(var i of[1,2,3])... 这样的语句在 Chrome 和 FireFox 中都是允许的(IE11 不支持 for..of 循环), typeof"string" 适用于所有这三者。

哪种行为是正确的?事实上,它是在我错过的某个地方定义的,还是所有这些影响都是每个浏览器解析器的特性造成的?

最佳答案

不是专家 - 我没有做过 JS 编译器,但做过其他的。

ecma-262.pdf 有点含糊,但是很明显,像1 in foo这样的表达式应该被解析为3个输入元素,都是token。每个 token 都是一个 CommonToken (11.5);在这种情况下,我们得到 numericLiteralidentifierName(是的,in 是一个 identifierName)和 标识符名称。解析 0b1 in foo 时也是如此(见 11.8.3)。

那么,当你取出 WS 时会发生什么?它没有明确涵盖(据我所知),但它是编写词法分析器扫描最长字符序列(可能与您可能正在寻找的内容匹配)时的常见做法(在其他语言中)。第 11 节的介绍几乎就是这样说的:

The source text is scanned from left to right, repeatedly taking the longest possible sequence of code points as the next input element.

因此,对于 0b1in foo,词法分析器经过 0b1,它匹配一个数字文字,然后到达 i,得到 0b1i ,不匹配任何内容。因此它将最长的匹配项 (0b1) 作为标记传递给解析器的其余部分,并再次从 i 开始。它找到 n,然后是 WS,因此将 in 作为第二个标记传递,依此类推。

所以,从根本上说,奇怪的是,IE 看起来是正确的。

关于javascript - 关键字和文字之间需要空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39127805/

相关文章:

c# - 尝试在 C#.NET/WPF 中获取网页时如何处理 JavaScript?

javascript - 如何在 Rails 中访问 c​​sv 文件

syntax - 马塔错误3204

r - 从R中的整个数据帧中删除空格

javascript - 如何一次向 URL 添加多个参数

javascript - 透明文本区域中的光标

javascript - 在 Javascript document.write 中添加空格

css - 我怎样才能去掉页面顶部/底部的白色间距?

syntax - ABAP 中的反引号和单引号

php - 我的 MySQL 更新查询有什么问题?