多言多败,多事多害。——《训蒙增广》
简述
在另一篇文章中有表述大致显示转化规则,隐式转换规则,着篇文章中会收集一些前端比较经典的关于类型转换的问题。下面就开始比较经典的面试题。
![] == []
这个题在另一篇面试中有记录过,![] == [].
(a == 1 && a == 2 && a == 3)
这个真的有很多种办法,这里只记录我知道的方法,如果有好的方法,请在下方留言,大家一起进步。
首先要知道==和===的区别
。
==
宽松匹配 : ==会先将左右两两边的值转化成相同的原始类型,然后再去比较他们是否相等
。
===他是不转化直接比较,如果类型不同直接就是false,如果类型相同,原始值相同就为true
。
这里主要讲解(a == 1 && a == 2 && a == 3)
相等的多种解法,如下:
- 重写
Object
的valueOf
- 重写
Object
的toString
- 重写
ToPrimitive
,es6 smybol('')
- 通过劫持 obj 的
getter
方法 - 数组
join、shift
- 字符串骚操作
重写 Object 的 valueOf、重写 Object 的 toString
重写代码的 valueOf 方法、和 toString 方法,如果不知道 ToPrimitive(obj, type)规则,请看ToPrimitive 规则我的另一篇博客。代码如下:
1 | const a = { value: 0 }; |
重写 ToPrimitive,es6 smybol(‘’)
在 ES6 之后,还允许对象通过显式指定 @@toPrimitive Symbol 来覆盖原有的行为,得到我们想要的结果。看代码:
1 | const a = { value: 0 }; |
Obj.defineProperty
通过劫持对象的属性值的 getter 操作,让他累加来做到我们想要的。
1 | var value = 0; |
通过数组的方式实现
通过改变数组的 join 方法实现。
1 | var a = [1, 2, 3]; |
字符串的骚操作
通过定义变量是包含空格,实现视觉上的相等。
1 | var aᅠ = 1; |
上面就是知道的可以让(aᅠ == 1 && a == 2 && ᅠa== 3 )
的六种方法,如果还有后面会接着补充,下面来说一下(a === 1 && a === 2 && a === 3)
。
(a === 1 && a === 2 && a === 3)
在上面介绍过==与===的区别
, ===是不会进行类型转换的,所以==的很多规则并不适用,那只有劫持方法和字符串的操作可以实现,其他方法都不能实现。
Obj.defineProperty
通过劫持对象的属性值的 getter 操作,让他累加来做到我们想要的。
1 | var value = 0; |
字符串的骚操作
通过定义变量是包含空格,实现视觉上的相等。
1 | var aᅠ = 1; |
未完待续。。。。如有经典试题可评论