什么时候a==1&&a==2&&a==3

废话少说,我们直接上代码

1. 使用 toString方法

var a = {i: 1 ,toString(){return a.i++;}}
if(a == 1 && a == 2 && a==3){
alert(“a=1,a=2,a=3条件成立”)
}
如果原始类型的值和对象比较,对象会转为原始类型的值,再进行比较

2.使用 valueOf

a.valueOf=function(){reutrn this.num+=1}
if(a1&&a2&a==3){
alert(“a=1,a=2,a=3条件成立”)
}
a == 1 =>
a.valueOf() ==1 =>
a.num += 1 ==1 =>
0 += 1 ==1 =>
1 == 1 => true
a == 2 =>
a.valueOf() == 2 =>
a.num += 1 == 2 =>
1 += 1 == 2 =>
2 == 2 => true
a == 3 =>
a.valueOf() == 3 =>
a.num += 1 == 3 =>
2 += 1 == 3 =>
3 == 3 => true

3.使用数组

var a = [1, 2, 3];
a.join = a.shift;

  if(a==1&&a==2&a==3){
	alert("a=1,a=2,a=3条件成立")
 }
 
可以看到数组 toString 会调用本身的 join 方法,
这里把自己的join方法该写为shift,每次返回第一个元素,
而且原数组删除第一个值,正好可以使判断成立。这里 == 比较也带来的副作用,
==比较的时候类型不一样会转换类型,
Object类型会调用toString,array调用join,number调用valueOf,
答案为重写Object的toString的方式。

4. 原始数据类型Symbol

let a = {[Symbol.toPrimitive]: ((i) => () => ++i) (0)};
if(a1&&a2&a==3){
alert(“a=1,a=2,a=3条件成立”)
}
ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。
我们之前在定义类的内部私有属性时候习惯用 __xxx ,这种命名方式避免别人定义相同的属 性名覆盖原来的属性,
有了 Symbol 之后我们完全可以用 Symbol值来代替这种方法,而且完全不用担心被覆盖。

5.利用with 关键字

var i = 0;
with({
get a() { 每次调用a读取 i的值
    return ++i;
}
})

if(a1&&a2&a==3){
alert(“a=1,a=2,a=3条件成立”)
}
with 也是被严重建议不使用的对象,这里也是利用它的特性在代码块里面利用对象的 get 方法动态返回 i

6.使用Object.defineProperty()

var val=0;
object.defineProperty(window,‘a’,{
get:function(){
return ++val;
}
});
if(a1&&a2&a==3){
alert(“a=1,a=2,a=3条件成立”)
}
我们知道我们用的全局变量也相当于 window 对象上的一个属性,
这里用defineProperty 定义了 a的 get 也使得其动态返回值。和with 有一些类似。

好了,本次介绍a1&&a2&&a==3就结束了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值