在 JavaScript 中,ToPrimitive 方法是一个抽象操作,用于将一个值转换为对应的原始值。当 JavaScript 引擎需要将一个非原始值转换为原始值时,会调用 ToPrimitive 方法。
ToPrimitive 方法接收两个参数:输入值和首选类型(可选)。首选类型用于指定转换后的原始值类型,可以是 “number”、“string” 或者默认值 “default”。如果不提供首选类型,则默认为 “default”。
ToPrimitive 方法执行的步骤如下:
- 如果输入值已经是原始值,则直接返回该值。
- 否则,调用输入值的
valueOf()
方法。如果该方法返回一个原始值,则将其作为结果返回。 - 否则,调用输入值的
toString()
方法。如果该方法返回一个原始值,则将其作为结果返回。 - 否则,抛出一个 TypeError 异常。
这个方法通常在 JavaScript 引擎内部使用,例如在执行比较操作符时,需要将对象转换为原始值。
在 ToPrimitive
方法中,type
参数指定了转换后的目标类型,可以是 "number"
或 "string"
。这两种类型的区别在于最终转换的结果会有所不同:
-
当
type
参数为"number"
时,ToPrimitive
方法会尝试首先调用对象的valueOf()
方法,如果返回的是一个原始值,则直接将其作为结果返回;否则再调用对象的toString()
方法,再根据返回值转换为数字类型的结果。 -
当
type
参数为"string"
时,ToPrimitive
方法会尝试首先调用对象的toString()
方法,如果返回的是一个原始值,则直接将其作为结果返回;否则再调用对象的valueOf()
方法,再根据返回值转换为字符串类型的结果。
所以,区别在于对 valueOf()
和 toString()
方法的调用顺序不同,从而影响了最终的转换结果。