Javascript Object.prototype.valueOf()方法

Javascript Object.prototype.valueOf()方法,javascript,Javascript,根据MDN,JavaScript调用valueOf方法将对象转换为原语值。如果对象没有原语值,valueOf返回对象本身,显示为: [对象] 但上面的valueOf以不同的格式返回,而不是返回原语 {0':“a” ,“1”:“b” ,'2':'c' }。这不是违背了定义吗?为什么它会以这种格式返回。现在,这造成了混乱。如何知道如果为数组和其他对象调用Object.prototype.valueOf.call(数组)将返回什么 另外,为什么返回对象形式{}.valueOf()会显示,因为从[]返回

根据MDN,JavaScript调用valueOf方法将对象转换为原语值。如果对象没有原语值,valueOf返回对象本身,显示为: [对象] 但上面的valueOf以不同的格式返回,而不是返回原语
{0':“a”
,“1”:“b”
,'2':'c'
}
。这不是违背了定义吗?为什么它会以这种格式返回。现在,这造成了混乱。如何知道如果为数组和其他对象调用Object.prototype.valueOf.call(数组)将返回什么

另外,为什么返回对象形式
{}.valueOf()
会显示,因为从
[]返回。valueOf()
方法在记录时不显示任何内容

让我们看看(这是一个链接)的作用:

让O作为调用ToObject的结果,并将此值作为参数传递

:

创建一个新字符串对象,其[[PrimitiveValue]]内部属性设置为参数的值。有关字符串对象的说明,请参见15.5

换句话说,它只是用原始值创建一个新字符串对象,即
newstring('abc')
。现在看看它在控制台中的显示方式,您会注意到它与
.valueOf.call
结果相同

编辑:这实际上与你使用什么媒介来查看答案有更多的关系。Chrome和Firefox的开发工具将字符串显示为它们的文字值(字符串本身),但将字符串对象显示为常规对象(通过显示它们的属性)

字符串只是一个字符的“数组”,上面有一些方法。因此表示法
{'0':'a','1':'b','2':'c'}
意味着“
a
在第一个位置,
b
在第二个位置,
c
在第三个位置”,这是您要求的字符串


最后,请注意,
valueOf
没有给出
[ObjectName]
。你可能指的是

也许我没有回答真正的问题。ECMA-262是这样说的:

15.2.4.4 Object.prototype.valueOf()

调用方法的值时,将执行以下步骤:

  • 让O作为调用ToObject的结果,将此值作为 争论

  • 如果O是使用 主机对象(),然后

    a。返回O或其他值,如 最初传递给构造函数的宿主对象。具体 返回的结果是实现定义的

  • 返回O

  • 在表达式中:

    Object.prototype.valueOf.call("abc")
    { '0': 'a'
    , '1': 'b'
    , '2': 'c'
    }
    Object.prototype.valueOf.call(new String("abc"))
    { '0': 'a'
    , '1': 'b'
    , '2': 'c'
    }
    
    正在使用以下字符串原语调用Object.prototype.valueOf。因此,在步骤1中,使用内部方法对其进行转换

    如果向对象传递String类型的值(即“abc”)将返回String对象

    步骤2是不相关的,因为对象不是主机对象(它是本机对象)

    步骤3返回toObject创建的对象

    因此,测试它:

    Object.prototype.valueOf.call("abc")
    
    typeof返回对象,因为结果值是字符串对象(typeof运算符的一个很好的怪癖)。你可以更进一步:

    var x = Object.prototype.valueOf.call("abc");
    
    alert(typeof x); // object
    

    所有这些都与返回的值(对字符串对象的引用)一致。

    我不确定您得到了什么,json片段做了什么<代码>{0':'a','1':'b','2':'c'}?从哪里获得
    [ObjectName]
    ?这可能是对返回的对象调用toString的结果(例如在执行
    警报(对象)
    控制台时)。如果通过object.prototype.valueOf(“字符串”)调用valueOf(),则应返回log(对象)
    @RobG[object ObjectName]不,不应该。您正在调用Object.prototype.valueOf并像这样传递字符串原语。因此,它被转换为字符串对象,这就是返回的内容。@Maizere:您是否将其与
    Object.prototype.toString
    ?如果对象没有原语值,valueOf将返回对象本身,显示为:[对象对象]。如果对象像上面的文章一样有基本值,但对于不同的对象,它将返回什么?如何知道?它是一个对象,所以它没有基本值(除非您计算步骤2)??您希望它如何有一个基本值?
    typeof x.match; // function
    x.constructor;  // function String() {[native code]}
    alert(x); // abc