toPrimitive()函数是一个内置函数,它可以将一个值转变为原始值(primitive value),即Boolean、Number或String类型。它可以被调用在任何JavaScript数据类型上。只需要传递一个可选的参数(hint),告诉函数应该如何转换值。
如果hint为string,则首先尝试调用valueOf()函数获取原始值,如果valueOf()方法无效,就调用toString()方法,最后再返回结果。如果hint为number或者没有传递hint,则首先尝试调用valueOf()获取原始值,如果valueOf()无效,则调用toString()方法,最后再将结果转成数字。
举个例子,如果我们有一个对象obj,我们可以通过以下方式调用toPrimitive()函数:
const obj = {
valueOf: function() {
return 100;
},
toString: function() {
return "200";
}
};
console.log(typeof obj) // "object"
console.log(obj + 50) // 150
console.log(obj * 2) // 200
console.log(String(obj)) // "200"
console.log(Number(obj)) // 100
在这个例子中,我们定义一个对象obj,obj具有valueOf()方法和toString()方法。当调用obj + 50时,JavaScript引擎会尝试获取其原始值(即数字类型)。由于hint为number,JavaScript引擎会优先尝试调用valueOf()方法,结果返回100,然后将100和50相加得到150。类似地,当尝试obj * 2时,JavaScript引擎会尝试调用valueOf()方法,由于valueOf()返回100,所以得到200。
当我们使用String()将obj转换为字符串时,hint为string,JavaScript引擎首先尝试调用valueOf()方法,但是valueOf()方法无效,因此JavaScript引擎尝试调用toString()方法,并返回字符串"200"。
使用Number()将obj转换为数字时,JavaScript引擎同样尝试调用valueOf()方法,由于valueOf()方法返回100,所以结果为100。