Javascript 关于Object.prototype.valueOf()方法的混淆
我最近读了一篇关于的文章,觉得他们说了些完全错误的话:Javascript 关于Object.prototype.valueOf()方法的混淆,javascript,Javascript,我最近读了一篇关于的文章,觉得他们说了些完全错误的话: valueOf()方法返回指定对象的原语值 我的意思是,如果我们讨论此方法的更具体版本,例如String.prototype.valueOf(),这句话会有一定的意义,因为它在原型链中更接近,因此会被调用,而不是Object.prototype方法,调用String对象的valueOf方法时。在这种情况下,将运行内部算法thisStringValue,并返回对象的内部属性[[StringData]]]的值,即原始字符串值。所以这实际上是从对
valueOf()
方法返回指定对象的原语值
我的意思是,如果我们讨论此方法的更具体版本,例如String.prototype.valueOf()
,这句话会有一定的意义,因为它在原型链中更接近,因此会被调用,而不是Object.prototype
方法,调用String
对象的valueOf
方法时。在这种情况下,将运行内部算法thisStringValue
,并返回对象的内部属性[[StringData]]]
的值,即原始字符串值。所以这实际上是从对象到原始值的转换
但据我所知,Object.prototype的valueOf
方法通过调用内部方法ToObject
,与完全相反
现在,如果对普通对象调用Object.prototype.valueOf()
,它将调用ToObject
传递方法的this值,该值指向对象本身,在这种情况下,ToObject
将只返回对象上的引用,该引用通过toString()
显示为[对象对象]
假设我们会用Object.prototype
的相关方法覆盖String.prototype.valueOf()
的值,例如,然后通过调用构造函数创建String
对象。-如果我们现在调用valueOf()
,我们将得到一个对象,而不是作为参数传入的原始字符串值。在object.prototype.valueOf()中只有ToObject
,在我看来,没有从对象到原始值的转换
那么,我是对的,他们是错的,还是我不明白?Object.prototype.valueOf
的目的只是作为对象的默认方法,而不是用更具体的方法覆盖它。你不应该直接调用这个函数,它只是因为没有更规范的东西而被调用调用对象的valueOf()
方法时,在原型链中输入
根据定义,如果一个对象没有覆盖它,它的“基本值”就是对象本身
valueOf()
方法返回指定对象的原语值
请记住,MDN是由像你和我这样的凡人编写的。我不会选择这种方式来总结valueOf
。一个更有意义的总结应该是(借用下面的“描述”):
valueOf()
MDN页面上的其余描述对我来说似乎相当合理和清晰
根据您的评论:
我认为将内置对象的所有方法视为一个是错误的,因为它们的行为方式不同,这在我在问题中链接的文章中有所暗示
但是文章本身说
每个内置核心对象都会重写此方法以返回适当的值
因此,它不是将它们视为一个。是的,接口有一个值,但在不同的对象上有不同的实现
如果说此方法将被“调用以将对象转换为基本值”,则是错误的
我在文章中没有看到这个确切的短语,但我觉得它听起来很对。这句话并不准确,正如您正确地说的,对于特定的实现来说“更真实”,但它是一个总结,并解释了该方法的意图
说该方法将“被调用以将对象转换为基本值”是错误的
不,是正确的。更准确地说:调用它是为了将对象转换为数字。从:
使用参数O和hint调用抽象操作OrdinaryToPrimitive时,将执行以下步骤:
断言:类型(O)是对象
断言:类型(提示)是字符串及其值
是“字符串”或“数字”
如果提示为“string”,则让
方法名称应为«“toString”、“valueOf”»
否则,就让方法名成为现实吧
«“valueOf”,“toString”»
对于methodNames中按列表顺序排列的每个名称,请执行以下操作
iii.如果类型(结果)是而不是对象,则返回结果
抛出TypeError异常
当然,不能保证valueOf
的实现实际上会返回一个基元值,但这就是该方法的目的。甚至Object.prototype.valueOf
实际上也会被调用,以将一个对象转换为基元值,前提是原型链中没有其他实现。正如您所知,它不会工作注意到了,但它仍然会被调用
你可以自己试试:
var myObject={
valueOf:function(){
console.log('valueOf');
归还这个;
},
toString:function(){
console.log('toString');
归还这个;
}
};
1+myObject;
你读过那页上的黄色小便笺吗?@RokoC.Buljan只需将String.prototype.valueOf()替换为Number.prototype.valueOf()。这是一样的:如果你用参数5调用构造函数并调用本机valueOf()来创建一个Number对象方法,则将数字5作为基元值。如果使用Object.prototype.valueOf()重写数字方法,则将对象作为返回值。没有区别。如果对象未在中重写此方法