js比较运算符

比较运算符分类: “相等"与"非相等”

“非相等”: 大于(>),小于(<),大于等于(>=),小于等于(<=)
“相等”: 相等 与 不等 (严格与一般)
“非相等”
依据ECMA-262 5.1版本,js非相等比较的实现是依靠一个抽象关系比较算法实现的.而这个算法主要由一个比较器和数据类型转换的ToPrimitive抽象操作构成.
参考资料:抽象关系比较算法 , ToPrimitive抽象操作 , 四种关系运算符的实现逻辑
(关于数据类型转换,也可以参考我的另一篇笔记: 加法与数据类型转换)
1.抽象关系比较算法(The Abstract Relational Comparison Algorithm)
说明:
(1)当被比较的两个表达式x和y都是字符串时,逐字符比较两串各个字符的Unicode码点,最后得出结果.

(2)当x和y之中至少有一个不是字符串时:
任务: 两个表达式x和y作某种比较

这个算法就只有一个比较器,用于判断左边的值是否比右边的值小

计算x和y两表达式的值px和py

px和py之中,先进行ToPrimitive转换为数值的,其转换结果作为比较器左边的输入;后转换的,其值作为右边的输入.(注意:是左边输入还是右边输入不是按照x,y相对于比较运算符的位置而决定的,而是由px和py的被转换顺序决定的)

标志位LeftFirst是一个Booelan值,决定了px和py谁先被转换.(true: px 先被转换为数值; false: py 先被转换为数值)

四种关系的比较由LeftFirst(转换顺序)和对比较器的结果的处理语句配合实现:

“<”: LeftFirst = true , 对比较器结果r处理:r为undefined,返回false;其余,返回r
‘’>": LeftFirst = false,其余与<相同
“<=”: LeftFirst = false , 对r的处理:r为undefined,返回false,其余,对r取反(除undefined外,相当于>的补集)
“>=”: LeftFirst = true , 对r的处理:r为undefined,返回false;其余,对r取反(除undefined外,相当于<的补集)
总结:
1.当x与y中至少有一个不是字符串时,比较的是转换为number类型后的值.(因为指定ToPrimitive的hint为number)
2.因为当r=undefiend时,此时至少有一个表达式的结果为NaN(px与py至少一个为NaN),故统一返回false.
3.当两表达式的计算结果均非NaN时,>和<可由LeftFirst取值不同而分别得到;<=与>=可由相同条件下的>和<分别求反得到.

相等
1.严格相等:

严格相等比较算法:参考资料

x与y类型不同,返回false

undefined与null与自身严格相等

x,y均为Number,

至少有一个为NaN,一律返回false
正0负0,严格相等
其余情况,若x,y值相等,返回true;否则一律返回false
x,y 均为String:完全相同的字符串时,返回true,否则返回false.

x,y 均为Boolean:同为true或同为false时,返回true,否则返回false.

严格相等与严格不相等的实现:

“= = =” : 计算表达式x与y的结果值,带入严格相等比较算法,其算法结果r即为===的结果.
“! = =”: 计算表达式x与y的结果值,带入严格相等比较算法,对算法结果r取反,作为!==的结果
2.一般相等:

抽象相等比较算法:参考资料
如果x与y类型相同:
均为undefined或null,返回true
均为Number类型:
若x,y至少有一个为NaN,返回false
正0与负0相等,返回true
其余情况,x与y值相同,返回true;否则,返回false
均为String类型,当x与y为完全相同的字符串时,返回true;否则返回false
均为Boolean类型,x与y相同时返回true;否则返回false
均为复合类型时,x与y指向同一个的对象/数组/函数时,返回true;否则返回false.(地址值相同)
如果x与y类型不同时:
undefined与null相等,返回true;undefined/null与其它数据类型比较,一律返回false.
其余情况时,存在数据类型的隐式转换:
x,y为原始类型里三种中的两种时,String与Boolean先ToNumber为Number,再进行比较
x,y中有一个为复合类型时,先将其ToPrimitive为原始类型,再进行比较
一般相等与一般不相等的实现:
= =: 计算表达式x与y的值,将结果带入抽象相等比较算法中,所得结果r即为==的结果.
! =: 计算表达式x与y的值,将结果带入抽象相等比较算法中,所得结果r再取反,即为==的结果.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值