在javascript原型中使用valueOf函数
我正在阅读有关javascript原型的内容,并阅读了以下代码,这些代码扩展了Number类,添加了一个显示对象类型的函数在javascript原型中使用valueOf函数,javascript,Javascript,我正在阅读有关javascript原型的内容,并阅读了以下代码,这些代码扩展了Number类,添加了一个显示对象类型的函数 Number.prototype.toString = function() { return typeof (this); } (123).toString(); //prints "object" 我读到,可以使用valueOf函数获得原语表示 n = new Number(123); typeof n.valueOf() // prints "numbe
Number.prototype.toString = function() {
return typeof (this);
}
(123).toString(); //prints "object"
我读到,可以使用valueOf
函数获得原语表示
n = new Number(123);
typeof n.valueOf() // prints "number"
所以我试着得到toString函数中的前置表示,比如
Number.prototype.toString = function() {
return typeof (this.valueOf());
}
(123).toString(); //prints "object"
我原以为它会返回“number”,但它打印了“object”。这是一种预期的行为还是我在两者之间遗漏了什么
更新:Firebug和chrome控制台为我打印“对象”,警报显示两种情况下的编号
更新2:这是一个错误。console.log((123).toString())打印的数字在对原语(如
42
JavaScript)调用方法时,会自动将其转换为相应的对象。当您通过.call()
或.apply()
将原语用作this
时,也会发生同样的情况(至少在IE中)
有关此行为的解释,请参见:
当V是具有基元基值的属性引用时,GetValue使用以下[[Get]]内部方法。使用base作为其this值并使用属性P作为其参数来调用它。采取以下步骤:
设O为对象(基)
顺便说一句,它不会发生在:
如果在严格模式代码中对此进行求值,则不会将此值强制为对象
valueOf()
不返回原语的原因:
返回
根据该参考:
短语“this Number value”指由该Number对象表示的数值,即该Number对象的[[PrimitiveValue]]内部属性的值,或者如果其类型为Number,则指this值
在对原语(如
42
JavaScript)调用方法时,JavaScript会自动将其转换为相应的对象。当您通过.call()
或.apply()
将原语用作this
时,也会发生同样的情况(至少在IE中)
有关此行为的解释,请参见:
当V是具有基元基值的属性引用时,GetValue使用以下[[Get]]内部方法。使用base作为其this值并使用属性P作为其参数来调用它。采取以下步骤:
设O为对象(基)
顺便说一句,它不会发生在:
如果在严格模式代码中对此进行求值,则不会将此值强制为对象
valueOf()
不返回原语的原因:
返回
根据该参考:
短语“this Number value”指由该Number对象表示的数值,即该Number对象的[[PrimitiveValue]]内部属性的值,或者如果其类型为Number,则指this值
我无法让它打印除“数字”以外的任何内容。即使您专门从一个数字创建一个
对象
,它也会变成一个数字
(我将方法命名为getType
,以避免与已有的toString
方法发生冲突。不过,我使用toString
得到了相同的结果。)
我已经在IE(10,9,8,7),Firefox和Chrome上测试过了,得到了同样的结果
测试:我无法让它打印除“数字”以外的任何内容。即使您专门从一个数字创建一个
对象
,它也会变成一个数字
(我将方法命名为getType
,以避免与已有的toString
方法发生冲突。不过,我使用toString
得到了相同的结果。)
我已经在IE(10,9,8,7),Firefox和Chrome上测试过了,得到了同样的结果
测试:它可以分解为:
// Case 1
typeof (Number(123)); // "number"
// Case 2
typeof (new Number(123)); // "object"
问题是为什么
案例1:这是因为Number(123)
实际上是一个函数调用,它将其参数值123
转换为Number
类型的值
案例2:
newnumber(123)
使用参数值创建一个Number
对象,由于new
,这是直接调用Number
构造函数;因此,我们在末尾得到类型对象。可以分解为:
// Case 1
typeof (Number(123)); // "number"
// Case 2
typeof (new Number(123)); // "object"
问题是为什么
案例1:这是因为Number(123)
实际上是一个函数调用,它将其参数值123
转换为Number
类型的值
案例2:newnumber(123)
使用参数值创建一个Number
对象,由于new
,这是直接调用Number
构造函数;因此,我们在最后得到类型object
。我无法重现这一点-我运行的代码与您上一个代码块(在Chrome javascript控制台)中的代码完全相同,并且得到了“number”…在IE9开发者工具javascript控制台中得到的结果相同(即,我得到的是“number”而不是“object”)。您使用什么浏览器获取“对象”?感谢您指出这一点。Firebug和chrome控制台为我打印“object”,alert在这两种情况下都显示数字typeof
是一个运算符,而不是一个函数,因此它后面的括号可能会丢失。请注意,这一观察结果与您的问题不太相关:我无法重现这一点-我正在运行您在上一个代码块(在Chrome javascript控制台中)中的代码,并且得到了“number”…在IE9 developer tools javascript控制台中得到了相同的结果(即,我得到的是“number”而不是“object”)。您使用什么浏览器获取“对象”?感谢您指出这一点。Firebug和chrome控制台为我打印“object”,alert在这两种情况下都显示数字typeof
是一个运算符,而不是一个函数,因此它后面的括号可能会丢失。请注意,这一观察结果与您的