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()重写数字方法,则将对象作为返回值。没有区别。如果对象未在中重写此方法