共计 1354 个字符,预计需要花费 4 分钟才能阅读完成。
直接开始题目是
if(a==1 && a==2 && a==3){alert('厉害了')
}
说句实话开发中谁写成这样保证会被打死。
不过面试就是面试,有面试官的考量点。
我理解的点有两个
1、隐式类型转换
先说说隐式类型转换有几种情况
先说条件判断 ==
- String 和 Number 比较:’1′ == 1,字符串会调用 Number() 方法转为数字后再比较。
- Boolean 和 Number 比较:true == 1, Boolean 调用 Number() 方法转为数字后再比较。
- 布尔值和字符串比较:true == ‘1’,会将双方调用 Number() 转换为 Number,然后再进行比较。
总结一句话,== 两侧非 Number 都会调用 Number() 转化后再调用。
再说说 + – * / 运算符
它们四个可以分两类,+ 和其它,我们都知道 + 既可以做运算符也可以做字符串链接。
1+1 = 2
1+"1" = "11"
2-'1' = 1
2*'1' = 2
2-/'1' = 2
除了 + 号运算符,其它运算符两侧如果有字符串数字的话也是会调用 Number 转换再运算。
聊到这里你发现这和题目没毛关系啊!过来人告诉你 冷静!往下看
2、valueOf / toString 等原生 api 的掌握程度
针对对象的 valueOf / toString 等原生 api,我们看数字和对象的比较 / 数字和对象的运算
以上我们总结单纯的隐式类型转换没办法解决问题
js 里除了空字符串、数字 0、null、undefined、false、NaN 为假 其它均为真。
JavaScript 调用 valueOf 方法将对象转换为原始值。你很少需要自己调用 valueOf 方法;当遇到要预期的原始值的对象时,JavaScript 会自动调用它。 官方是这么说的。
1 == {valueOf:()=>{return 1}
}
//true
从结果看 对象会自动调用 valueOf 方法
这样我们就可以改成:
a = {
value :0,
valueOf :function(){
this.value++
return this.value
}
}
1==a //true
2==a //true
3==a //true
// 结果为 true,每次隐式类型转换的过程都会自动调用 valueOf。// 接下来说 toString
// 都有 valueOf 了 还说 toString 干嘛,的确默认都会调用,只不过有优先级。// 我只能说 js 作者很牛逼。// 如果同时有包含它们两个(valueOf 和 toString 会怎么样
a = {
value :0,
valueOf :function(){
this.value++
return this.value+'aa'
},
toString:function(){
this.value+=2
return this.value
}
}
规则就是这样,当 valueOf 返回不为基本类型的时候,回去调用 toString 方法。
调用了三次结果变为 6
还有一个很骚的方法,是从一个小姐姐博客看到的,https://juejin.im/post/5d124a12f265da1b9163a28d
文章第六题:我聊的这个就是这个题,不过感觉小姐姐聊得更专业点。
let arr=[1,2,3]
arr.join = arr.shift
arr ==1
arr ==2
arr ==3
结果完美,不过小姐姐的意思是数组的 toString 方法会自动触发数组的 jion。这个真是厉害了!
正文完
发表至: javascript
2019-07-04