我试图验证我的整个脚本 through the new JSLint ,但是这样:
function a() {
'use strict';
var string;
string = string.replace(/\x00*/g, '');
}
它抛出:
意外' x'在' \'。
之后string = string.replace(/\x00*/g, '');
旧版本没有抛出任何错误。我意识到它处于测试阶段,但我希望它的效果与旧版本一样好。顺便说一下,\x00
代表空字符。
那么,ECMAScript 6是否有所改变?它只是一个JSLint错误吗?我实际上做错了吗?
答案 0 :(得分:3)
“正则表达式文字可能与'/ ='混淆”当JSLint,JSHint(版本1.0.0之前)或ESLint遇到以=字符开头的正则表达式文字时,会引发错误。在下面的示例中,我们尝试分配正则表达式文字以使字符串“= 1”与变量x匹配:
引发此错误以突出显示可能令人困惑的代码段。如果你没有修复这个错误,你的代码就会正常运行,但是对其他人来说可能会让人感到困惑,尤其是乍一看有人快速搜索你的脚本。
/字符在JavaScript中含糊不清。它可以表示正则表达式文字的开头或结尾,如上例所示,也可以解释为除法运算符。与大多数算术运算符一样,除法运算符可以与赋值运算符组合以生成简写:
https://jslinterrors.com/a-regular-expression-literal-can-be-confused-with
所以你需要使用RegExp
构造函数:
string.replace(new RegExp('\\x00*', 'g'), '');
哪个输出与正则表达式文字相同的正则表达式:
console.log(new RegExp('\\x00*', 'g').toString() === /\x00*/g.toString()); // true
提示
NULL字符\x00
可缩短为\0
(MDN docs)
new RegExp('\\0*', 'g')
-
更新
@ nhahtdh的回答显示您可以使用/\u0000*/g
字面值。
答案 1 :(得分:0)
根据ECMAScript规范:
\x00
在语法扩展下有效:
Atom -> \ AtomEscape
AtomEscape -> CharacterEscape
CharacterEscape -> HexEscapeSequence
HexEscapeSequence -> x HexDigit HexDigit
和模式语义:
生产
CharacterEscape :: HexEscapeSequence
通过评估HexEscapeSequence
的CV(见7.8.4)并返回其字符结果来评估。
\0
始终被解释为与DecimalEscape
的模式语义匹配NUL字符:
生产
DecimalEscape :: DecimalIntegerLiteral [lookahead ∉ DecimalDigit]
评估如下:
- 让
i
成为DecimalIntegerLiteral
的MV。- 如果
i
为零,则返回由EscapeValue
字符组成的<NUL>
(Unicode值0000)。- 返回由整数
醇>EscapeValue
组成的i
。“
DecimalIntegerLiteral
的MV”的定义见7.8.3。注意如果
\
之后是第一个数字不为0的十进制数n
,则转义序列被认为是 反向引用。如果n
大于整个常规中左侧捕获括号的总数,则会出错 表达。\0
代表<NUL>
字符,后面不能跟十进制数字。
因此,我不确定为什么JSLint会禁止这些结构。从某些测试来看,它们似乎没有在解析器中实现,因为这样的简单代码:
var x = /(['"])\1/;
抛出"Unexpected '1' after '\'."
错误。
如果要获取传递JSLint的代码,可以使用\u0000
指定NUL字符。否则,您可以忽略此错误。