如果查看ECMAScript 3规范,您将看到原始值类型Null和Undefined没有伴随Null和Undefined对象。
>> Null
ReferenceError: Null is not defined
其他原始值类型Number,String和Boolean类型确实包含可以从全局范围引用的Number,String和Boolean对象。
>>Number
function Number() { [native code] }
>>Boolean
function Boolean() { [native code] }
这些原始值类型的目的是为其各自的原始值类型提供toString
和valueOf
等方法:
>>var n = 1;
>>n.toString();
"1"
与
相同>>var n = 1;
>>Number.prototype.toString.call(n);
"1"
布尔和字符串也是这样的:
>>var b = true;
>>b.toString();
"true"
>>Boolean.prototype.toString.call(b);
"true"
当您尝试混合类型时,您可以看到原始值对象正在使用其伴随对象的方法:
>>Boolean.prototype.toString.call(n);
TypeError: Boolean.prototype.toString is not generic
>>Number.prototype.toString.call(b)
TypeError: Number.prototype.toString is not generic
有趣的是,对于布尔和字符串文字类型,您可以直接从文字中调用这些方法:
>>true.toString();
"true"
>>Boolean.prototype.toString.call(true)
"true"
>>"moo".toString();
"moo"
>>String.prototype.toString.call("moo")
"moo"
原始值null和undefined,因为它们没有伴随Null和Undefined对象不能做这些事情:
>>Null
ReferenceError: Null is not defined
>>null.toString()
TypeError: Cannot call method 'toString' of null
原始值类型编号的行为类似于两者的混合。如果直接使用Number的原型对象的方法,可以在文字上调用toString
:
>>Number.prototype.toString.call(1);
"1"
但是你不能像字符串和布尔值一样从文字本身访问该方法:
>>1.toString()
SyntaxError: Unexpected token ILLEGAL
为什么数字文字的行为与布尔和字符串不同,即使有一个Number对象?
答案 0 :(得分:33)
你可以以相同的方式访问它,这是一个不同的解析问题,要做到这一点,使用稍微不同的语法:
(1).toString()
数字可以有小数,因此当您去解析代码时,使用括号有效时,以小数结尾的语法有点模棱两可。当你发现这也是有效的时候会更清楚一点:
(1.).toString()
然而,只有1.toString()
它正在尝试使用小数解析数字,并且失败。
答案 1 :(得分:5)
我想你会在this answer找到另一个Stack Overflow问题的答案。总结一下Theo的答案:
[解析]解析器期望跟随一个数字 用点作为浮点 文字。 [...] [Y]你只需要添加另一个点来使其工作[。]
答案 2 :(得分:0)
Null(大写N)是变量名。保留字区分大小写。 null是对象null。 typeof null ===“object”// true