原型链不直接参与隐式转换,而是为ToPrimitive操作提供toString/valueOf等方法的查找路径;这些方法通常定义在原型上,如Array.prototype.toString,且可通过[Symbol.toPrimitive]覆盖,优先级最高。

原型链本身不直接参与对象到基本类型的隐式转换查找。真正起作用的是 JavaScript 的抽象操作 ToPrimitive,它按规范流程调用对象的内置方法(如 toString 和 valueOf),而这些方法的定义位置——往往就在原型链上。
原型链提供转换方法的存放位置
对象自身通常不重写 toString 或 valueOf,而是继承自原型。例如:
-
Array.prototype.toString定义了数组转字符串的行为(如[1,2].toString() → "1,2") -
Number.prototype.valueOf返回原始数值,toString返回字符串表示 -
Date.prototype.toString优先被调用(因 Date 对象的 PreferredType 默认为"string")
ToPrimitive 查找依赖原型链,但绑定与调用分离
当引擎执行 ToPrimitive(obj, hint) 时:
- 若
hint === "string":先尝试obj.toString()→ 若返回原始值则用;否则再调obj.valueOf() - 若
hint === "number":顺序相反,先valueOf,再toString - 这些方法若不在实例上,就会沿
__proto__向上查找,直到Object.prototype
可被覆盖的转换逻辑
开发者可通过在原型或实例上定义以下任一方式干预转换行为:
立即学习“Java免费学习笔记(深入)”;
- 重写
toString或valueOf方法(如Array.prototype.toString = () => "custom") - 设置
[Symbol.toPrimitive]方法(优先级最高),它接收hint参数并自主决定返回值
注意:[Symbol.toPrimitive] 是一个自有属性,不通过原型链继承;但若定义在原型上,实例仍可通过原型链访问到它。
常见对象的转换结果示例
不同对象因原型上方法实现不同,隐式转换结果差异明显:
-
[]{}:非 Date 对象,默认hint="number"→{}.valueOf()返回{}(非原始值)→ 再调{}.toString()→"[object Object]" -
[](空数组):[].valueOf()返回[]→[].toString()返回""→ 所以[] + [] → "" -
new Date():PreferredType 默认为"string"→ 直接调toString()→ 返回格式化时间字符串


















