以下代码的输出结果如何:
console.log({}.valueOf()+15);//Output:[object Object]15
.valueOf()方法的返回值是否为上述代码中的字符串,或者只是一个对象,因为 .toString()会导致相同但是这个方法返回值无论如何都是字符串。我只想知道 .valueOf()在上面的代码中返回的值的类型。如果返回值是一个字符串,对于其他什么对象将 valueOf()方法返回字符串值,但 [new String(" abc")]
除外答案 0 :(得分:3)
valueOf
返回原始值。究竟什么类型的原始值取决于对象。
演示:
typeof Number(0).valueOf(); // number
typeof Boolean(0).valueOf(); // boolean
关键在于,无论它返回什么,它都是原始值。另一方面,toString
总是返回一个字符串。
对于{}
,除了valueOf
之外没有Object.prototype.valueOf
方法,它与Object.prototype.toString
相同,返回[object Constructor]
形式的字符串1}}。哪个是字符串会导致与15
串联。
答案 1 :(得分:3)
普通对象的.valueOf()
将是同一个对象。 ( NOT 与其.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"
答案 2 :(得分:0)
要获取JS中对象的类型,可以使用 typeof 函数:
typeof({}) // outputs 'object'
typeof({}.valueOf()) // outputs 'object'
typeof({}.valueOf()+15) // outputs 'string'
这表示在尝试“添加”15时会发生值强制,而后者被解释为字符串连接。