文章目录
严格===和普通==
JavaScript中存在两种方式判断两个值是否相等
严格相等
(===和!==)
要求比较的两个值类型必须是相同的普通相等
(==和!=)
尝试将两个不同类型的的值转换为相同类型,再使用严格相等比较
严格相等(===,!==)
1、不同类型的值总是严格不相等
2、如果两个值类型相同,则会有以下几种情况
1) 是否为undefined === undefined
//true
2) 是否为null === null
//true
3) 比较两个数字
x === x //true
+0 === -0 //true
NaN === NaN //false
【注意】NaN与自身总是不相等,不管是严格相等还是普通相等
4) 比较两个Boolean值,比较两个字符字符串:结果 显而易见
5) 比较两个对象(包括数组和函数),只有是同一个对象的时候才是相等的
6)其他情况严格相等结果为false
严格不等!==
x !== y 等价于 !(x === y)
普通相等
1、如果两个值的类型相同(Undefined,Null,Boolean,String,Nummber,Object 其中之一),
使用严格相等比较
2、否则,如果运算数是以下类型
1) undefined == null
//true,认为是宽松相等
2) 字符串和数字比较
将字符串转为数字,进行严格相等比较
3) 布尔值和非布尔值比较
将布尔值转为数字,进行普通相等比较
4) 对象和数字或字符串比较
尝试把对象转为原始值,再进行普通相等比较
5) 其他情况普通相等结果为false
普通不等!=
x != y 等价于 !(x == y)
陷阱一:普通相等和布尔转换不同
转换成布尔值
手动转换函数:Boolean()
值 | 转换成布尔值 |
---|---|
null | false |
undefined | false |
布尔值 | 不需要转换 |
数字 | 0,NaN转为false,其他为true |
字符串 | ‘’(空串)转为false,其他为true |
对象 | 总是为true |
但是请注意,这只是其它类型的值转换为布尔值的结果,并不意味着它们与布尔值之间的等价关系
。
看看下面的例子:
//数字
> 2==true //2===1
< false
> 2==false //2===0
< false
> 1==true //1===1
< true
> 0==false //0===0
< true
//字符串,不是所有的非空字符串都==true
> ''==false //0===0
< true
> '1'==true //1===1
< true
> '2'==true //2===1
< false
> 'abc'==true //NaN===1
< false
陷阱二:普通相等中的字符串
字符串转成数字
手动转换函数:Number()
字符串 | 转换为数字 |
---|---|
undefined | NaN |
null | 0 |
布尔值 | false转换为0,true转换为1 |
数字 | 不需要转换 |
字符串 | 解析字符串中的数字(忽略开头和结尾的空格)若无法转换则为NaN;空串转为0;如Number('123')->123;Number('123a')->NaN |
对象 | 调用ToPrimitive(value, number)转换成原始类型 |
//有一些可能是我们预期的结果
> 'abc'==new String('abc') //'abc'==='abc'
< true
> '123'==123 //123===123
< true
> ''==0 //0===0
< true
//但有时候也存在一些问题
> '\n\t123\r'==123
< true
陷阱三:普通相等中的对象
如果比较对象和非对象,他们会被转换成原始值,导致产生一些奇怪的结果
> {}=="[Object Object]"
< true
> '[123]'==123
< true
> []==0
< true
ToPrimitive()——将值转为原始值
要将 任意值转换为字符串或是数字类型,首先会被转换为任意的原始值,然后转换为最终的结果。
ToPrimitive(input, <PreferredType>)
可选参数PreferredType
表明转换之后的类型,Number
或String
如果是转换为Number
,会执行一下几步:
1、如果input是原始值,返回这个值;
2、否则,如果input
是对象,调用input.valueOf()
,如果得到的结果是原始值,返回值这个原始值;
3、否则,调用input.toString()
,如果结果是原始值,返回这个原始值;
4、否则,抛出异常TypeError(输入的input
值转换成原始值出错)
- 如果
PreferredType
是String
,交换上述2和3步。
ToPrimitive()实战
valueOf()默认实现返回this,toString()默认实现返回类型信息;
> var obj={}
> obj.valueOf() == obj
< true
> obj.toString()
< '[object Object]'