0
Object.prototype.valueOf.call("abc")
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}
Object.prototype.valueOf.call(new String("abc"))
{ '0': 'a'
, '1': 'b'
, '2': 'c'
}

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

还有为什么{}.valueOf()会显示返回对象表单,因为在记录时从 [].valueOf()方法返回什么都不显示

4

2 回答 2

6

让我们看看valueOf(那是一个链接)做了什么:

令 O 为调用 ToObject 并将 this 值作为参数传递的结果。

对象

细绳

创建一个新的 String 对象,其 [[PrimitiveValue]] 内部属性设置为参数的值。有关 String 对象的描述,请参见 15.5。

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

编辑:这实际上与您用来查看答案的媒介有关。Chrome 和 Firefox 的开发工具将字符串显示为它们的文字值(字符串本身),但将字符串对象显示为就好像它们是常规对象一样(通过显示它们的属性)。

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

最后一点,valueOf不给[object ObjectName]. 你可能指的是Object.prototype.toString

于 2013-05-15T08:32:03.113 回答
3

也许我错过了实际的问题。这是 ECMA-262 所说的:

15.2.4.4 Object.prototype.valueOf()

当调用valueOf方法时,会采取以下步骤:

  1. O为调用 ToObject 并将 this 值作为参数传递的结果。

  2. 如果O是使用宿主对象 ( 15.2.2.1 )调用 Object 构造函数的结果,则

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

  3. 返回O

在表达式中:

Object.prototype.valueOf.call("abc")

Object.prototype.valueOf使用字符串原语调用this。所以在第 1 步,它使用内部ToObject方法进行转换。

如果传递一个 String 类型的值(“abc”是),ToObject将返回一个 String 对象。

步骤 2 无关紧要,因为该对象不是宿主对象(它是本机对象)。

第 3 步返回由toObject创建的对象。

所以测试一下:

var x = Object.prototype.valueOf.call("abc");

alert(typeof x); // object

typeof返回object因为结果值是一个 String 对象(typeof 运算符的一个很好的怪癖)。你可以更进一步:

typeof x.match; // function
x.constructor;  // function String() {[native code]}
alert(x); // abc

所有与返回值一致的是(对)一个 String 对象的引用。

于 2013-05-15T09:11:20.587 回答