为什么数字文字不能访问Number方法?

如果您查看ECMAScript 3规范,您会看到原始值typesNull和Undefined没有伴随的Null和Undefined Objects。

>> Null ReferenceError: Null is not defined 

其他基本值types数字,string和布尔types确实伴随着您可以从全局范围引用的Number,String和Boolean对象。

 >>Number function Number() { [native code] } >>Boolean function Boolean() { [native code] } 

这些原始值types的目的是为它们各自的原始值types提供诸如toStringvalueOf类的方法:

 >>var n = 1; >>n.toString(); "1" 

是相同的

 >>var n = 1; >>Number.prototype.toString.call(n); "1" 

布尔和string也是这样工作的:

 >>var b = true; >>b.toString(); "true" >>Boolean.prototype.toString.call(b); "true" 

您可以看到,当您尝试混合types时,原始值对象正在使用其伴随对象的方法:

 >>Boolean.prototype.toString.call(n); TypeError: Boolean.prototype.toString is not generic >>Number.prototype.toString.call(b) TypeError: Number.prototype.toString is not generic 

有趣的是布尔和stringtypes,你可以直接从文字中调用这些方法:

 >>true.toString(); "true" >>Boolean.prototype.toString.call(true) "true" >>"moo".toString(); "moo" >>String.prototype.toString.call("moo") "moo" 

原始值为null,未定义,因为它们没有伴随的Null和Undefined对象不能做这些事情:

 >>Null ReferenceError: Null is not defined >>null.toString() TypeError: Cannot call method 'toString' of null 

原始值types数字performance得像两者的混合。 如果您直接使用数字原型对象的方法,您可以在文字上调用toString

 >>Number.prototype.toString.call(1); "1" 

但是你不能像string和布尔值那样从字面本身访问方法:

 >>1.toString() SyntaxError: Unexpected token ILLEGAL 

为什么数字文字的行为与布尔和string有所不同,即使有一个Number对象?

可以用同样的方式访问它,这是一个不同的parsing问题,使用稍微不同的语法:

 (1).toString() 

数字可以有小数,所以当你去parsing代码时,用十进制结尾的语法有点模糊,使用括号是有效的。 当你看到这一点也是有效的时候有点清楚:

 (1.).toString() 

然而,只是1.toString()它试图parsing为一个小数的数字 ,并失败。

我想你会在另一个堆栈溢出问题的答案中find你的问题的答案 。 总结西奥的回答:

parsing器期望一个数字后面跟一个点是一个浮点数字。 […] [Y]你只需要添加另一个点,使其工作[。]

空(大写N)是一个variables名。 保留字区分大小写。 null是对象null。 typeof null ===“object”// true