对象到原始值转换(ToPrimitive操作)的底层机制
- 概述:当JavaScript引擎需要将一个对象转换为原始值时,会执行ToPrimitive操作。这个操作会尝试调用对象的
valueOf
和toString
方法来获取原始值。
- 内部方法
- [[DefaultValue]]:这是一个内部方法,用于执行ToPrimitive操作。当对象需要被转换为原始值时,会调用这个内部方法。
- [[Get]]:用于获取对象的属性值,在获取
valueOf
和toString
方法时会用到。
- 转换顺序
- Number类型偏好(默认):
- 首先,JavaScript引擎会检查是否有显式的
hint
参数。如果没有,默认hint
为"number"
。
- 然后,引擎会调用对象的
valueOf
方法。如果valueOf
方法返回的是原始值,则返回该原始值。例如:
const obj = {
valueOf: function() {
return 42;
}
};
const result = obj + 1; // 这里obj会进行ToPrimitive操作,由于valueOf返回原始值42,结果为43
- 如果`valueOf`方法返回的不是原始值(仍然是对象),则调用`toString`方法。如果`toString`方法返回原始值,则返回该原始值。例如:
const obj = {
toString: function() {
return "42";
}
};
const result = obj + 1; // 这里obj会进行ToPrimitive操作,valueOf返回对象,调用toString返回"42",结果为"421"
- 如果`toString`方法返回的也不是原始值(仍然是对象),则抛出`TypeError`。
- String类型偏好:
- 当有显式的
hint
参数且为"string"
时,会先调用toString
方法。如果toString
方法返回原始值,则返回该原始值。例如:
const obj = {
toString: function() {
return "hello";
}
};
const result = String(obj); // 这里显式转换为字符串,调用toString返回"hello"
- 如果`toString`方法返回的不是原始值(仍然是对象),则调用`valueOf`方法。如果`valueOf`方法返回原始值,则返回该原始值。
- 如果`valueOf`方法返回的也不是原始值(仍然是对象),则抛出`TypeError`。