2

以下代码的输出将是什么:

console.log({}.valueOf()+15);//Output:[object Object]15

.valueOf()方法的返回值是上面代码中的字符串还是只是一个对象,因为.toString()会产生相同的结果,但是使用此方法返回的值无论如何都是字符串。我只是想知道会是什么上面代码中.valueOf()返回的值的类型。如果返回值是一个字符串,除了[new String("abc")]之外, valueOf()方法会返回什么其他对象的字符串值

4

3 回答 3

3

valueOf返回一个原始值。究竟什么类型的原始值取决于对象。

展示:

typeof Number(0).valueOf(); // number
typeof Boolean(0).valueOf(); // boolean

关键是,无论它返回什么,它都是一个原始值。toString另一方面,总是返回一个字符串。

在 的情况下,除了 root 之外{}没有其他方法,它与 相同,返回表单的字符串。这是一个字符串导致与.valueOfObject.prototype.valueOfObject.prototype.toString[object Constructor]15

于 2013-04-21T17:16:55.567 回答
3

普通对象的.valueOf()将是同一个对象。(这与它的方法.toString()不同。)

var o = {};

typeof o.valueOf(); // "object"

o === o.valueOf(); // true

+运算符看到您没有对第一个操作数使用数字,因此它不是加法,而是进行字符串连接并调用其两个操作数的值.toString()

这就是为什么你得到[object Object]15.


您可以通过更改toString()输出来测试它。

var o = {};
o.toString = function() { return "foobar" }

o.toString(); // "foobar"

o + 15;           // "foobar15"
o.valueOf() + 15; // "foobar15"
于 2013-04-21T17:18:33.127 回答
0

要在 JS 中获取对象的类型,可以使用typeof函数:

typeof({}) // outputs 'object'
typeof({}.valueOf()) // outputs 'object'
typeof({}.valueOf()+15) // outputs 'string'

这表明在尝试“添加”15 时发生了值强制,而将其解释为字符串连接。

于 2013-04-21T17:18:07.427 回答