Javascript Slimit python缩小器奇怪的行为

Javascript Slimit python缩小器奇怪的行为,javascript,python,minify,Javascript,Python,Minify,我正试图用Python'slimit'包缩小一些javascript import slimit slimit.minify('[1,2,3,4,5,6,7,8]') 罚款并返回“[1,2,3,4,5,6,7,8]” import slimit slimit.minify('[01,02,03,04,05,06,07,08]') 给出一个错误: SyntaxError:在1:23之间出现意外标记(数字“8”) LexToken(数字,'0',1,22)和LexToken(RBRACKET,'

我正试图用Python'slimit'包缩小一些javascript

import slimit
slimit.minify('[1,2,3,4,5,6,7,8]')
罚款并返回“[1,2,3,4,5,6,7,8]”

import slimit
slimit.minify('[01,02,03,04,05,06,07,08]')
给出一个错误:

SyntaxError:在1:23之间出现意外标记(数字“8”) LexToken(数字,'0',1,22)和LexToken(RBRACKET,']',1,24)

奇怪的是,缩小字符串[01,02,03,04,05,06,07]可以正常工作


Slimit仅在缩小数组中的8个或更多零填充整数时返回错误。

尽管我不确定它是否是相对的

这可能是(javascript中的parseInt问题)

如果我们只是简单地使用

some_number = parseInt(08);
它返回0。(在某些浏览器中)


似乎json也不支持解码以0开头的数字。

这取决于slimit使用的lexer。以“0”(但不是“0x”)开头的数字被视为八进制整数。因此,序列“08”以两个单独的令牌(“0”、“8”)结束,因此出现“意外令牌”错误

注意以下几点:

>>> from slimit import lexer
>>> L = Lexer()
>>> L.input("02")
>>> L.token() 
LexToken(NUMBER,'02',1,0)
>>> L.input("08")
>>> L.token()  
LexToken(NUMBER,'0',1,0)
>>> L.token()
LexToken(NUMBER,'8',1,1)
查找lexer时,我们可以看到用于识别数字的正则表达式:

t_NUMBER = r"""
(?:
    0[xX][0-9a-fA-F]+              # hex_integer_literal
 |  0[0-7]+                        # or octal_integer_literal (spec B.1.1)
 |  (?:                            # or decimal_literal
        (?:0|[1-9][0-9]*)          # decimal_integer_literal
        \.                         # dot
        [0-9]*                     # decimal_digits_opt
        (?:[eE][+-]?[0-9]+)?       # exponent_part_opt
     |
        \.                         # dot
        [0-9]+                     # decimal_digits
        (?:[eE][+-]?[0-9]+)?       # exponent_part_opt
     |
        (?:0|[1-9][0-9]*)          # decimal_integer_literal
        (?:[eE][+-]?[0-9]+)?       # exponent_part_opt
     )
)
"""
slimit是应该支持八进制表示,还是将其视为简单的以10为基数的整数,这个问题值得商榷

JSON规范明确禁止八进制形式的数字,一些工具会将其标记为无效JSON(try)。发件人:

不允许八进制和十六进制形式。不允许使用前导零


有人刚刚添加了一个答案,然后删除了它!?答案是前导零表示八进制数,因此08和09是无效数字。这在Python中是正确的,但是Javascript允许08和09,将它们转换为十进制8和9。或许Slimit包应该处理数字来复制Javascript规则。这就是为什么您应该始终提供基数作为
parseInt
的第二个参数。