全面分析toString与valueOf,并随手解决掉几道大厂必备面试题( 三 )

toString()一样 , 但是优先级要高于这两者;

  • 该函数被调用时 , 会被传递一个字符串参数hint , 表示当前运算的模式 , 一共有三种模式:
    • string:字符串类型
    • number:数字类型
    • default:默认
  • 下面来看看实现吧:
    class A {constructor(count) {this.count = count}valueOf() {return 2}toString() {return '哈哈哈'}// 我在这里[Symbol.toPrimitive](hint) {if (hint == "number") {return 10;}if (hint == "string") {return "Hello Libai";}return true;}}const a = new A(10)console.log(`${a}`)// 'Hello Libai' => (hint == "string")console.log(String(a))// 'Hello Libai' => (hint == "string")console.log(+a)// 10=> (hint == "number")console.log(a * 20)// 200=> (hint == "number")console.log(a / 20)// 0.5=> (hint == "number")console.log(Number(a))// 10=> (hint == "number")console.log(a + '22')// 'true22'=> (hint == "default")console.log(a == 10)// false=> (hint == "default")复制代码比较特殊的是(+)拼接符 , 这个属于default的模式 。
    划重点:此方法不兼容IE , 尴尬到我不想写出来了~~
    面试题分析以下几道大厂必考的面试题 , 完美呈现出 toStringvalueOf 的作用 。
    1. a===1&&a===2&&a===3 为 true双等号(==):会触发隐式类型转换 , 所以可以使用 valueOf 或者 toString 来实现 。
    每次判断都会触发valueOf方法 , 同时让value+1 , 才能使得下次判断成立 。
    class A {constructor(value) {this.value = https://www.shianvip.com/article/value;}valueOf() {return this.value++;}}const a = new A(1);if (a == 1 && a == 2 && a == 3) {console.log("Hi Libai!");}复制代码全等(===):严格等于不会进行隐式转换 , 这里使用 Object.defineProperty 数据劫持的方法来实现
    let value = https://www.shianvip.com/article/1;Object.defineProperty(window,'a', {get() {return value++}})if (a === 1 && a === 2 && a === 3) {console.log("Hi Libai!")}复制代码上面我们就是劫持全局window上面的a , 当a每一次做判断的时候都会触发get属性获取值 , 并且每一次获取值都会触发一次函数实行一次自增 , 判断三次就自增三次 , 所以最后会让公式成立 。
    • 注:defineProperty 可参考这篇文章学习 , 点我进入传送门
    • 自:大厂面试题分享:如何让(a===1&&a===2&&a===3)的值为true?
    2. 实现一个无限累加函数问题:用 JS 实现一个无限累加的函数 add , 示例如下:
    add(1); // 1add(1)(2);// 3add(1)(2)(3); // 6add(1)(2)(3)(4); // 10 // 以此类推复制代码【全面分析toString与valueOf,并随手解决掉几道大厂必备面试题】function add(a) {function sum(b) { // 使用闭包a = b ? a + b : a; // 累加return sum;}sum.toString = function() { // 只在最后一次调用return a;}return sum; // 返回一个函数}add(1)// 1add(1)(2)// 3add(1)(2)(3)// 6add(1)(2)(3)(4)// 10 复制代码