JavaScript中toPrimitive()函数是如何执行的?

6 min read

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。