前不久由于一个项目设计的问题,烦心了好几天,为了避免留坑拥抱强类型语言特色,仍是选择了'==='做为数据判断是否相等,对于'=='今天来探究一下猫腻(弱类型的JavaScript的坑真的太多了,typescript真香)typescript
这个操做符相信学过开发的人彻底不陌生,对于强类型语言我这儿就不作过多描述,我们这儿就钻JavaScript的牛角尖设计
x == y,x,y都表示一个值,这个操做符返回的是bool值true或者false;code
对于这个操做有相对应的比较方式(对于全部的JavaScript类型):对象
1.若type(x)和type(y)相同,则: a.若type(x)为undefined,返回true b.若type(x)为null,返回true c.若type(x)为number,则: i.若 x 为NaN,返回false ii.若 y 为NaN,返回false iii.若 x , y 为相同数值,返回true iv.若 x 为 +0且 y 为 -0,返回true v.若 x 为 -0且 y 为 +0,返回true d.若type(x)为string,则当 x , y 彻底为相同字符序列的时候(长度和相同位置的字符同样)返回true e.若type(x)为boolean,当 x , y 同为true返回true,不然返回false 2.若 x 为null且 y 为undefined,返回true 3.若 x 为undefined且 y 为null,返回true 4.若type(x)为number且type(y)为string,返回x == ToNumber(y)的结果 5.若type(x)为string且type(y)为number,返回ToNumber(x) == y的结果 6.若type(x)为boolean,返回ToNumber(x) == y的结果。同理,若type(y)为boolean,返回ToNumber(y) == x的结果 7.若type(x)为string或者number,且type(y)为object,返回x == ToPrimitive(y)的结果。同理,若type(y)为string或者number,且type(x)为object,返回y == ToPrimitive(x)的结果
ToPrimitive是对象转换基本类型的方法。ip
看个例子:开发
[] == ![] // true
根据上述规则来解析:string
1.![]为false,上式为: [] == false 2.第6条:上式为: [] == ToNumber(false) => [] == 0, 3.第7条:上式为:ToPrimitive([]) == 0, 4.[].toString() = '',上式为:'' == 0, 5.第4条:上式为:0 == 0 => true