1 双等号的隐式调用和数据劫持
- 求下面条件,在a为什么样时,等号成立
if(a == 1 && a == 2 && a == 3){console.log('等号成立')
}
1.1 双等号的隐式转换
- 首先得了解双等号的隐式转换规则
等式 | 备注 |
---|---|
对象 == 字符串 | 隐式调用 toString方法将对象转换成字符串 |
null == undeifned | 相等 |
NaN == NaN | 不相等 |
其他情况 | 都转换成数字进行比较. |
- 思路: 根据双等号的隐式转换规则,每次调用调用toString(),可以重写a属性下面的toString方法,初始时i的值设置为0,每次返回++i
// 双等号
var a ={i: 0,toString(){return ++this.i}
}
if(a == 1 && a == 2 && a == 3){console.log('等号成立')
}
1.2 数据劫持
-
还有一种方法是使用数据劫持,没当读取a元素时返回一个i
-
数据劫持回顾:
// ES5: Object.defineProperty
Object.defineProperty(obj, 'name', {get(){console.log('获取')},set(){console.log('设置')}
})
- 使用数据劫持完成小栗子
var i = 0;
Object.defineProperty(window, 'a',{get(){return ++i;}
})