废话不说,直接上菜!
a 满足什么条件时 下述表示式返回 true
if (a == 1 && a == 2 && a == 3) {
console.log("true");
}
咋一看,我尼玛这样还能成立?内心os:又是一道八股文,内心在问自己,面试问到这道题我能答出来吗?其他人能答出来吗?
三连击 完毕了,可以开始 我们的正题了。你也不要怕,让我来告诉你正确的答案吧🤓🤓🤓🤓🤓🤓🤓
沉下心来,好好看看这一道题,到底考的是什么?
你的内心OS: 肯定会说,笔者怕不是二傻子吧,这还不明显吗,看见 ==,那不就是 考察类型转化吗?
恭喜你,你已经击败 一半的人了,接下来一半,就让我们继续击败他们吧!
首先我们要知道 == 涉及到类型转换的相关知识,这里我已经从各个渠道总结了一套规律(如若不完整,不正确的地方,望大家指出!)
== 会进行类型转换,转换规则如下:(按照1,2,3,4,5的步骤对比)
1.两端类型相同,不做转换,直接比较值
2.两端存在NaN,返回false;
3.undefined 和 null 只有与自身比较时,或者互相比较时返回true,其他情况返回false;
4.两端都是原始类型,转换成数字比较;
5.一端是原始类型,一端是对象,将对象转换成原始类型再比较,然后进行第四步
**对象转换成原始类型的步骤**
如果对象有[symbol.toPrimitive]方法,调用该方法,该方法如果返回原始类型,不再进行后续步骤,转换不了抛出异常;
如果对象有valueOf方法,调用该方法,如果返回原始类型,使用该值进行比较,得不到原始类型,继续进行后续步骤;
如果对象有toString方法,调用该方法,如果返回原始类型,使用该值进行比较,得不到原始类型,抛出异常;
现在万事俱备只欠东风,想必各位读者心中已经有答案了吧!那就快来看看和笔者的答案是否一样吧!
var a= {
value:1,
valueOf:function(){
return this.value++;
},
toString:function(){
return this.value++;
},
[Symbol.toPrimitive]:function(){
return this.value++;
}
}
if (a == 1 && a == 2 && a == 3) {
console.log("true");
}
哎呦不错哦,完美解答!你和我是一样的吗?😎😎
为了知其然和知其所以然,我们来看看涉及到的三个方法吧!
[Symbol.toPrimitive]valueOftoString
咱就不参考其他资料了,直接上MDN吧!
- Symbol.toPrimitive
附上地址
官方解释:Symbol.toPrimitive 是内置的 symbol 属性,其指定了一种接受首选类型并返回对象原始值的表示的方法。它被所有的强类型转换制算法优先调用。
官方例子:
const object1 = {
[Symbol.toPrimitive](hint) {
if (hint === 'number') {
return 42;
}
return null;
}
};
console.log(+object1);
// Expected output: 42
我的理解是其实和官方的理解是一样的! 哈哈哈哈 我也装模作样的用自己的话解释一下吧!
- [Symbol.toPrimitive]
是JavaScript 中的一个内置 Symbol,它允许对象自定义转换为原始值的行为。当一个对象被强制转换为原始值时,JavaScript 引擎会优先调用对象的 [Symbol.toPrimitive] 方法,以确定对象应该如何转换为原始值。[Symbol.toPrimitive] 方法是一个函数,它不接受任何参数,并且应该返回对象的原始值表示。
- valueOf
当一个对象需要被转换为原始值时,比如使用比较操作符(如 ==)或进行算术运算时,JavaScript 引擎会尝试调用对象的 valueOf 方法。如果对象具有 valueOf 方法,将会调用该方法并返回其结果作为原始值。通常情况下,valueOf 方法用于返回对象的一个适当的原始值表示。
- toString
当一个对象需要被转换为字符串时,比如进行字符串拼接、输出到控制台或使用字符串相关的方法时,JavaScript 引擎会尝试调用对象的 toString 方法。如果对象具有 toString 方法,将会调用该方法并返回其结果作为字符串。通常情况下,toString 方法用于返回对象的一个字符串表示。
需要注意的是,在某些情况下,JavaScript 引擎可能会先尝试调用 valueOf 方法,如果返回的结果不是原始值,才会继续调用 toString 方法来获取字符串表示。
写到最后:
- 希望大家指出本文中出现的错误!
- 你们还有更好的解法吗?