共计 604 个字符,预计需要花费 2 分钟才能阅读完成。
也许很多人看到这个表达式,会脱口而出,不就是 56 吗?因为函数会把 070 当做八进制字面量解析,转换之后就是十进制的 56。看起来真的就是这样, 浏览器的运行结果也确实是这样,
那我们试试给这个函数传入第二个参数,也就是转换的基数,运行结果如下:
是不是和想像的不一样? 把 070 转换成十进制数,不应该是 70 吗?怎么跟上面的 56 不一样呢?这是为什么呢?和下面的图片一对比,恍然大悟。
事实上,parseInt 的第一个参数传入的是字符串,而这个例子里面,传入的 070 是一个八进制数 56,函数运算时会隐式地将数字转换成字符串 56,这样再转换成数字,十进制就是 56,八进制就是 46 了。我们可以验证一下,
查一查 API 也能够验证。
事实上,ECMAScript 5 规范不再允许 parseInt 函数的实现环境把以 0 字符开始的字符串作为八进制数值。ECMAScript 5 陈述如下:
根据给定 radix,parseInt 函数产生一个由字符串参数内容解析过来的整数值。字符串中开头的空白会被忽略。如果 radix 没有指定或者为 0,参数会被假定以 10 为基数来解析,如果数值以字符对 0x 或 0X 开头,会假定以 16 为基数来解析。
这与 ECMAScript 3 有所不同,ECMAScript 3 仅仅是不提倡这种做法但并没有禁止这种做法。
直至 2013 年,很多实现环境并没有采取新的规范所规定的做法, 而且由于必须兼容旧版的浏览器, 所以永远都要明确给出 radix 参数的值 。
正文完
发表至: javascript
2020-06-22