[Symbol.toPrimitive](hint) hint 什么时候为 default?

问题描述

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方法的学习

猜你喜欢

转载自blog.csdn.net/weixin_50290666/article/details/122953351