一、前言(比较规则)
JS中的相等操作符由 ( == )表示,如果两个操作数相等,则返回true。
原理:相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。
二、基本规则
如果相等操作符两边的操作数,不包含 null 或者 undefined,且两个操作数不全是对象,在执行相等比较之前,会先调用 Number() 将两个操作数强制转为 Number 类型,然后进行比较。
基本数据类型:
1.如果有一个操作数是(number,string,Boolean),则在比较相等性之前,将其转换为数值;
2.在比较相等性之前,不能将 null 和 undefined 转成其他值,且null 和 undefined 是相等的。
3.如果有一个操作数是 NaN,则都返回 false;(NaN不与任何相等,包括NaN)
'55' == 55;
'1.232'==1.232;
false == 0;
"wise" == 3;
[] == 0;
复杂数据类型
1 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
2 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;
NaN == NaN;
[] == [];
[] == ![];
{} == {};
{} == !{};
三、[] == [] 和 {} == {}
在 JavaScript 中,Object、Array、Function、RegExp、Date 都是引用类型。
声明引用类型的时候,变量名保存在 js 的栈内存里面,而对应的值保存在堆内存里面。而这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针
var a = {};
var b = {};
var c = b;
a == b;
b == c;
注意:如果两个对象指向同一个对象,相等操作符返回 true,否则则为false
四、[] == ![] 和 {} == !{}
逻辑非 (!) 的优先级高于相等操作符 ( == )。参考链接:JavaScript 运算符优先级
[] == ![]
{} == !{}
注意:转布尔值==》Boolean() 代表空、否定的值会被转换为 false ,如 ''、0、NaN、null、undefined
转数字类型:
Number(false)
Number(true)
Number('')
Number('12')
Number('sda')
Number([1,2])
Number({})
Number(NaN)
Number(!NaN)
Number(null)
Number(!null)
Number(!undefined)
Number(undefined)
五、数组与数值
数组会先通过调用toString()转换为字符串后再转换为数值,比如[true]转换为字符串后为"true",然后再转换为数值是NaN,所以[true]==1返回false。
console.log([]==0);
console.log([1]==1);
console.log(["1"]==1);
console.log([1,2]==1);
console.log([true]==1);
Number(['a'])
['1'] == 1
事实上,数组、对象和函数在与其他基本数据类型进行比较时都会先转换为字符串,然后再转换为相应的数据类型。
六、null == 0 、null >= 0 、null > 0
1.关系运算符知 和 相等运算符 并不是一个类别的.
2.关系运算符,在设计上总是需要运算元道尝试转为一个number,而相等运算符在设计上,则没有这方面的考虑.
null==0
null > 0
null>=0
null<=0
小结:
1.比较两个操作数相等时,有运算符根据运算符优先级,要先算==两侧的,然后再去强制转换类型,最后再去比较;
2.数组(对象,函数)会先通过调用toString()转换为字符串后再转换为数值
3.注意在比较时出现NaN,null,undefined时,不强制转换为数字类型
4.在关系运算符中,null,undefined会被Number()强制转换成数字类型;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)