js中对象的类型转化

46 阅读1分钟

背景

首先我们以向量开始。

  • js当中如果我们想要表示两个向量相加,通常会实例化两个相关的对象然后调用对应的method。
  • 但是py,c++中不一样,这些语言允许我们自定义运算符对对象的处理方式,实现特殊的对象处理方法来处理加法

对象到原始值的转换,是由许多期望以原始值作为值的内建函数和运算符自动调用的

用一句话说就是: js不允许 obj1 + obj2的结果是一个对象

不允许基础运算是一个对象的限制

既然不允许是一个对象,那么js就会要求实现相应的方法时必须是一个基础类型,否则就会报错。

一些官方的流程

自动转化涉及三类方法

  1. 调用 obj[Symbol.toPrimitive](hint) 如果这个方法存在,
  2. hint 是 "string"尝试调用 obj.toString() 和 obj.valueOf(),无论哪个存在。
  3. 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
}