以下是一些大厂面试中可能会遇到的问题,以及关于如何让(a===1)这个问题的解答思路:### 问题:如何让(a===1)这个问题可能是在考察你的编程能力、逻辑思维和解决问题的能力。以下是一些可能的解答思路:#### 1. 直接赋值最简单的方法就是直接给变量

摘要:当我第一次看到这一题目的时候,我是比较震惊的,分析了下很不合我们编程的常理,并认为不大可能,变量`a`要在同一情况下要同时等于1,2和3这三个值,这是天方夜谭吧,不亚于哥德巴赫`1+1=1`的猜想吧,不过一切皆有可能,出于
当我第一次看到这一题目的时候,我是比较震惊的,分析了下很不合我们编程的常理,并认为不大可能,变量a要在同一情况下要同时等于1,2和3这三个值,这是天方夜谭吧,不亚于哥德巴赫1+1=1的猜想吧,不过一切皆有可能,出于好奇心,想了许久之后我还是决定尝试解决的办法。 我的思路来源于更早前遇到的另外一题相似的面试题: // 设置一个函数输出一下的值 f(1) = 1; f(1)(2) = 3; f(1)(2)(3) = 6; 当时的解决办法是使用toString或者valueOf实现的,那我们先回顾下toString和valueOf方法,方便我们更深入去了解这类型的问题: 比如我们有一个对象,在不重写toString()方法和valueOf()方法的情况下,在 Node 或者浏览器输出的结果是这样的 class Person { constructor() { this.name = name; } } const best = new Person("Kobe"); console.log(best); // log: Person{name: "Kobe"} console.log(best.toString()); // log: [object Object] console.log(best.valueOf()); // log: Person{name: "Kobe"} console.log(best + "GiGi"); // log: [object Object]GiGi best Person best.toString() [object Object] best.valueOf() Person best + 'GiGi' [object Object]GiGi 从上面的输出我们可以观察到一个细节,toString()输出的是[object Object],而valueOf()输出的是Person对象本身,而当运算到best + 'GiGi'的时候竟然是输出了[object Object]GiGi,我们可以初步推断是对象调用的toString()方法得到的字符串进行计算的,难道是运算符+的鬼斧神工吗? 为了验证我们上一步的推断,我们稍微做一点改变,把 valueOf 方法进行一次复写: class Person { constructor(name) { this.name = name; } // 复写 valueOf 方法 valueOf() { return this.name; } } best Person best.toString() [object Object] best.valueOf() Person best + 'GiGi' KobeGiGi 这次跟上面只有一处产生了不一样的结果,那就是最后的best + 'GiGi'前后两次结果在复写了valueOf()方法之后发生了改变,从中我们可以看出来,对象的本质其实没有发生根本的改变,但是当它被用作直接运算的时候,它的值是从复写的valueOf()中获取的,并继续参与后续的运算。 当然不要忘了我们还有个toString()方法,所以我们也复写它,看看结果会不会也受影响: class Person { constructor(name) { this.name = name; } valueOf() { return this.name; } toString() { return `Bye ${this.name}`; } } best Person best.toString() Bye Kobe best.valueOf() Kobe best + 'GiGi' KobeGiGi 我们发现 best + 'GiGi'还是没有发生任何改变,还是使用我们上一次复写valueOf()的结果 其实我们重写了valueOf方法,不是一定调用valueOf()的返回值进行计算的。而是valueOf返回的值是基本数据类型时才会按照此值进行计算,如果不是基本数据类型,则将使用toString()方法返回的值进行计算。
阅读全文