我正在阅读Douglas Crockford的JavaScript:The Good Parts,我正处于定义淡入淡出功能的地步.部分代码归结为:
var level = 1;
var hex = level.toString(16);
Run Code Online (Sandbox Code Playgroud)
所以我在浏览器的控制台中运行它以查看我得到的内容....
var level = 1;
level.toString(16);
Run Code Online (Sandbox Code Playgroud)
嘿,它返回" 1"...... Fabuloso!Wunderbar酒吧!
然后,为了厚颜无耻,我试着看看我得到了什么......
1.toString(16);
Run Code Online (Sandbox Code Playgroud)
我明白了
SyntaxError:意外的标记ILLEGAL
什么是什么?如果level变量等于1,并且在该级别上运行此方法工作正常,那么为什么不在实际的数字1上运行此方法呢?我尝试了一种与该toPrecision()方法类似的实验,并且在两种情况下均可正常工作.这是什么问题?这是JavaScript实现中的另一个固有缺陷,还是我错过了什么?我正在Google Chrome中测试.
相关:Stack Overflow问题为什么数字文字不能访问Number方法?.
什么是背后的逻辑42..toString()与..?
双点工作并返回字符串"42",而42.toString()单个点失败.
同样,42...toString()三个点也失败了.
谁能解释这种行为?
console.log(42..toString());Run Code Online (Sandbox Code Playgroud)
console.log(42.toString());Run Code Online (Sandbox Code Playgroud)
为什么2..toString()返回2但2.toString()会抛出此错误?
例:
console.log(2..toString()); // prints 2
// Firefox throws the error
// `SyntaxError: identifier starts immediately after numeric literal`
console.log(2.toString());
var x = 2;
console.log(x.toString()); // prints 2
// Firefox throws the error
//`TypeError: XML descendants internal method called on incompatible Number`
console.log(x..toString());
Run Code Online (Sandbox Code Playgroud) 伙计们,我DO知道为什么10..toString()的工作,但10.toString()不?问题存在,但问题是它没有提供正式的解释.
规范的解释.该特定位置的字符是小数.这由ECMAScript的数字文字语法定义.
没有参考标准是不够可信的
我下意识地明白了
42..toString()
Run Code Online (Sandbox Code Playgroud)
解析器将其视为一个42.数字,然后是一个.toString()调用.
我无法理解的是为什么翻译无法实现这一点
42.toString()
Run Code Online (Sandbox Code Playgroud)
是一个42接着一个方法调用.
它只是现代JS解释器的缺点还是由ES5.1明确说明?
从ES5.1开始,Numeric Literal被定义为(仅是定义的重要部分):
NumericLiteral ::
DecimalLiteral
HexIntegerLiteral
DecimalLiteral ::
DecimalIntegerLiteral . DecimalDigits(opt) ExponentPart(opt)
. DecimalDigits ExponentPart(opt)
DecimalIntegerLiteral ExponentPart(opt)
Run Code Online (Sandbox Code Playgroud)
最后一条规则是我希望解析器选择的规则.
UPD:澄清一下,这个问题希望作为ES规范的答案参考,明确说明解释器必须像它一样行事
最近我发现这是完全有效的:
1..toString(); //"1"
Run Code Online (Sandbox Code Playgroud)
对我来说,一开始它看起来有点奇怪,但是通过进一步的探索,我发现它有效是因为浏览器将第一个1.视为数字。
这将我们引向了这个问题。如果我拨打.toString一个号码:
1.toString(); //SyntaxError
Run Code Online (Sandbox Code Playgroud)
它不会工作。但是,如果我这样做:
1.0.toString(); /*or*/ 1..toString(); //"1"
Run Code Online (Sandbox Code Playgroud)
有用。
为什么1和之间有区别1.0?我以为 JavaScript 中没有数字类型?为什么小数点很重要?
为什么
123.toString()
Run Code Online (Sandbox Code Playgroud)
抛出一个SyntaxError
而
123..toString()
Run Code Online (Sandbox Code Playgroud)
不是?