以下是一些大厂面试中可能会遇到的问题,以及关于如何让(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()方法返回的值进行计算。
