在Javascript中类型转换只有三种情况:
- 转换为布尔值
- 转换为数字
- 转换为字符串
转换为原始类型
对象在转换类型的时候,会执行原生方法 ToPrimitive
算法如下:
- 如果已经是 原始类型 ,则返回当前值
- 如果需要转 字符串 则先调用toString方法,如果此时是 原始类型 则直接返回,否则再调用valueOf方法并返回结果
- 如果不是 字符串,则先调用valueOf方法,如果此时是 原始类型 则直接返回,否则再调用toString方法并返回结果
- 如果都没有 原始类型 返回,则抛出 TypeError 类型错误
一道面试题:a可以同时==1 && ==2 && ==3吗?
const a = { arr: [3, 2, 1], valueOf() { console.group('valueOf') console.log(this.arr) console.groupEnd('valueOf') return this.arr.pop() } } if (a == 1 && a == 2 && a == 3) { console.log('yes!') }
当然还有其他的实现方式:
比如:
对getter的劫持
当对象属性在进行查询时会被调用get方法
const a = new Proxy({}, { val: 1, get() { return () => this.val++ } }) if (a == 1 && a == 2 && a == 3) { console.log('yes!') }