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