技术性的东西,我一直喜欢去看别人的很少去自己总结写出来,可能是自己的理解能力不够强,需要大量的文字才能描述清楚,所以一直也不想弄写这种东西,随便写吧,没深度,写深度一点的呢,研究不了那么透彻。
这段时间看到一些文章,唯一有点印象,也是以前从没想过的,感觉很神奇的题目如下:
var a = ?;
if(a == 1 && a == 2 && a == 3){
console.log(1);
}
当a是什么情况的时候会打印1?
当时看到这个题目是很懵x的状态,还能这样???可能是本人脑子不灵活吧,根本就搜索不到这个是考察了js的什么知识点,问了同事后,才恍然大悟,应该是对隐式类型的转换的考察。
看到这个题目一开始会想,a难道会变??a肯定不能是一个基本数据类型吧,如果不会变的话,那它怎么又能等于1又能等于3呢?
最先想到的是Object.defineProperty属性!对属性进行拦截操作
Object.defineProperty(window, 'a', {
get: function() {
return this.value = this.value ? (this.value += 1) : 1;
}
})
每次查询a的值的时候获取到的值都会进行+1操作
解法2
- 利用toString
var a = {
value: 1,
toString() {
return a.value++
}
}
当进行==操作的时候,右边的是number类型,所以左边的a是object,先进行类型转换转成number,调用toString方法或者是toValue方法
解法3
- 利用toValue
这个和toString类似
解法4
最骚气的解法
用数组的方法
var a = [1,2,3];
a.join = a.shift;
当a == 1的时候,数组会进行类型转换,调用join方法,而数组的join方法被覆盖,获取到的值是每次弹出来的数组的第一位。
写在最后:
对于遇到==号的时候的类型转换须知
== 如果两者类型不同,首先需要进行类型转换。具体流程如下:
1, 首先判断两者类型是否相同,如果相等,判断值是否相等.
2,如果类型不同,进行类型转换
3,判断比较的是否是 null 或者是 undefined, 如果是, 返回 true .
4,判断两者类型是否为 string 和 number, 如果是, 将字符串转换成 number
5,判断其中一方是否为 boolean, 如果是, 将 boolean 转为 number 再进行判断
6,判断其中一方是否为 object 且另一方为 string、number 或者 symbol , 如果是, 将 object 转为原始类型再进行判断
第一次写这种总结型的文章,写出来也需要多看,最重要的还是需要理解,希望自己以后能产出一些高品质的文章吧