背景
首先我们以向量开始。
- js当中如果我们想要表示两个向量相加,通常会实例化两个相关的对象然后调用对应的method。
- 但是py,c++中不一样,这些语言允许我们自定义运算符对对象的处理方式,实现特殊的对象处理方法来处理加法
对象到原始值的转换,是由许多期望以原始值作为值的内建函数和运算符自动调用的
用一句话说就是: js不允许 obj1 + obj2的结果是一个对象
不允许基础运算是一个对象的限制
既然不允许是一个对象,那么js就会要求实现相应的方法时必须是一个基础类型,否则就会报错。
一些官方的流程
自动转化涉及三类方法
- 调用
obj[Symbol.toPrimitive](hint)如果这个方法存在, - hint 是
"string"尝试调用obj.toString()和obj.valueOf(),无论哪个存在。 - hint 是
"number"或者"default"尝试调用obj.valueOf()和obj.toString()
注意前后区分先后顺序。
那么一个对象类型转化的结果应该是什么
既然不允许obj1 + obj2是一个对象,那么为什么还要需要类型转化呢?
一个理由是为了方便打印对象的一些值,来方便我们调试。 (虽然我并没有使用那么多的样子)
小试牛刀
const sum1 = sum(1)
sum1(3) == 4 // true
sum(1)(2)(3) == 6 // true
解题思路
sum函数返回一个新的函数
- 实现新的函数的toprimitve方法,返回一个值
- 用闭包记录传入的值
const sum = (a)=>{
const res = (b)=> a + b
res[Symbol.topirmitive] = ()=>a
return res
}