问题描述
Symbol.toPrimitive() 用于将对象转换为原始值,包括字符串、数字和未指定的原始类型。
且其转换取决于传入的一个字符串参数 hint 。
hint 的可能取值为 ‘number’、‘string’、‘default’。
举例说明如下,创建一个对象并修改其 Symbol.toPrimitive 属性:
根据 hint 的不同类型,让其返回不同的值。
let test = {
[Symbol.toPrimitive] = function(hint){
switch(hint){
case 'number': return 3;
case 'string': return 'string case';
case 'default':
default: return 'default case';
}
}
console.log(3 + test); // "3default case"
console.log(3 - test); // 0
console.log(String(test)); // "string case"
通过上例 :
② 3 - test ,该场景应该将 test 转换为数值,因此传入 hint 为 ‘number’,结果为 0。
③ String(test) ,该场景应该将 test 转换为字符串,因此传入 hint 为 ‘string’,结果为 ‘string case’,
这两个比较容易理解,
而 ① 3 + test 的结果为 ‘3default case’,可知 test 调用Symbol.toPrimitive 时传入的 hint 为 ‘default’,
这是因为 + 运算符在此场景下,既可以表示数值相加 ,也可以表示字符串拼接,因此该场景转换为 ‘number’ 或 ‘string’ 都可行,当出现这种场景时,传入的 hint 即为 default。
总结
hint 取值为:
‘number’:该场合需要转成数值,
‘string’:该场合需要转成字符串,
‘default’:该场合可以转成数值,也可以转成字符串。
参考资料
来自 segmentfault 的 luoqua 大佬的文章
toString方法和valueOf方法以及Symbol.toPrimitive方法的学习