为什么数字文字不能访问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提供诸如toString
和valueOf
类的方法:
>>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