每日一题-加深印象:toString()和数据劫持的用处

每日一题-加深印象:toString()和数据劫持的用处

四月 14, 2019

下面的代码,a如何处理才能打印出‘success’

1
2
3
4
var a;
if (a == 1 && a == 2 && a == 3) {
console.log('success')
}

相等操作符,等号两边的数据类型不一样的时候,有一个隐式类型转换,先转换再比较,转换规则

  • null 相等于 undefined,null和undefined和其他值比较的时候不相等
  • NaN 不等于NaN,也不等于其他任何的值
  • 对象和字符串比较,先调用对象的toString方法把对象转换成字符串,进行比较
  • 剩下的转换成数字

重写的对象toString方法

1
2
3
4
5
6
7
8
9
var a = {
i: 0,
toString() {
return ++this.i
}
};
if (a == 1 && a == 2 && a == 3) {
console.log('success');
}

重写数组的toString方法

1
2
3
4
5
6
var a = [1,2,3];

a.toString = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log('success');
}

数据劫持

1
2
3
4
5
6
7
8
9
var i = 0;
Object.defineProperty(window, 'a', {
get() {
return ++i;
}
})
if (a == 1 && a == 2 && a == 3) {
console.log('success');
}