我正在阅读有关javascript原型的内容,并且我通过以下代码扩展了Number类,以添加一个显示对象类型的函数
Number.prototype.toString = function() {
return typeof (this);
}
(123).toString(); //prints "object"
我读到可以使用valueOf
函数
n = new Number(123);
typeof n.valueOf() // prints "number"
所以我试着在toString函数中得到preoteive表示,如
Number.prototype.toString = function() {
return typeof (this.valueOf());
}
(123).toString(); //prints "object"
我期待它返回“数字”,但它打印出“对象”。这是一种预期的行为还是我错过了某些东西?
更新:Firebug和chrome控制台为我打印“对象”,并在两种情况下提醒显示号码 更新2:这是一个错误。 console.log((123).toString())打印号码
答案 0 :(得分:2)
我无法打印除" number"以外的任何内容。即使您专门从数字创建Object
,它也会变成一个数字。
(我将方法命名为getType
以避免与现有的toString
方法发生任何冲突。但我使用toString
得到了相同的结果。)
Number.prototype.getType = function() {
return typeof this.valueOf();
}
console.log((123).getType()); // prints "number"
var n = 123;
console.log(n.getType()); // prints "number"
var o = new Number(123);
console.log(o.getType()); // prints "number"
var x = new Object(123);
console.log(x.getType()); // prints "number"
我已经在IE(10,9,8,7),Firefox和Chrome中对此进行了测试,并得到了相同的结果。
答案 1 :(得分:1)
在原语上调用方法时,如42
JavaScript会自动将其转换为相应的对象。当您通过this
或.call()
使用.apply()
原语时,会发生同样的情况(至少在IE中)。
可以在ES5 spec:
中找到有关此行为的说明当V是具有基本基值的属性引用时,GetValue使用以下[[Get]]内部方法。使用base作为其值并使用属性P作为其参数调用它。采取以下步骤:
设O为
ToObject(base)
。
顺便说一下,strict mode不会发生这种情况:
如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象。
valueOf()
未返回原语is here:
以下参考文献:
短语“this Number value”是指此Number对象表示的Number值,即此Number对象的<[PrimitiveValue]]内部属性的值,或者该值的类型是数字。
答案 2 :(得分:1)
可以分解为:
// Case 1
typeof (Number(123)); // "number"
// Case 2
typeof (new Number(123)); // "object"
问题是为什么?
案例1:这是因为Number(123)
实际上是一个函数调用,它将其参数值123
转换为类型Number
的值。
案例2: new Number(123)
使用参数值创建Number
对象,这是直接调用Number
构造函数因为new
;因此我们最后会得到object
类型。