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