浅谈JS的==和===

严格===和普通==

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表明转换之后的类型,NumberString
如果是转换为Number,会执行一下几步:
1、如果input是原始值,返回这个值;
2、否则,如果input是对象,调用input.valueOf(),如果得到的结果是原始值,返回值这个原始值;
3、否则,调用input.toString(),如果结果是原始值,返回这个原始值;
4、否则,抛出异常TypeError(输入的input值转换成原始值出错)

  • 如果PreferredTypeString,交换上述2和3步。

ToPrimitive()实战

valueOf()默认实现返回this,toString()默认实现返回类型信息;

> var obj={}
> obj.valueOf() == obj
< true

> obj.toString()
< '[object Object]'
发布了29 篇原创文章 · 获赞 8 · 访问量 4765

猜你喜欢

转载自blog.csdn.net/qq_40738077/article/details/102063446