JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

一、前言(比较规则)

JS中的相等操作符由 ( == )表示,如果两个操作数相等,则返回true。
原理:相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。

二、基本规则

如果相等操作符两边的操作数,不包含 null 或者 undefined,且两个操作数不全是对象,在执行相等比较之前,会先调用 Number() 将两个操作数强制转为 Number 类型,然后进行比较。

基本数据类型:
1.如果有一个操作数是(number,string,Boolean),则在比较相等性之前,将其转换为数值;
2.在比较相等性之前,不能将 null 和 undefined 转成其他值,且null 和 undefined 是相等的。
3.如果有一个操作数是 NaN,则都返回 false;(NaN不与任何相等,包括NaN)

'55' == 55;       //true   ( Number('55') -> 55 )
'1.232'==1.232;   //true
false == 0;       //true   ( Number(false ) -> 0 )
"wise" == 3;      //false ( Number("wise") -> NaN )
[] == 0;          //true  ( Number([]) -> 0 )

复杂数据类型
1 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
2 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;

NaN == NaN;  //false (参考第4条规则)
[] == [];    //false
[] == ![];   //true
{} == {};    //false
{} == !{};   //false

三、[] == [] 和 {} == {}

在 JavaScript 中,Object、Array、Function、RegExp、Date 都是引用类型。
声明引用类型的时候,变量名保存在 js 的栈内存里面,而对应的值保存在堆内存里面。而这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针

var a = {};
var b = {};
var c = b;
a == b;   //false(变量a,b保存的分别是a,b的指针,它们指向不同的对象)
b == c;   //true(变量c保存的是b的指针,它们指向同一个对象)

注意:如果两个对象指向同一个对象,相等操作符返回 true,否则则为false

四、[] == ![] 和 {} == !{}

逻辑非 (!) 的优先级高于相等操作符 ( == )。参考链接:JavaScript 运算符优先级

[] == ![]  //![] == false  ->Number([]) == Number(false)  ->  0 == 0  ->  true
{} == !{}  //!{} == false  ->  Number({}) == Number(false)  ->  NaN == 0 ->  false

注意:转布尔值==》Boolean() 代表空、否定的值会被转换为 false  ,如 ''0NaNnullundefined
转数字类型:
Number(false) // 0;
Number(true) // 1;

Number('') // 0;
Number('12') // 12;
Number('sda') // NaN;
Number([1,2]) //  NaN;
Number({}) // NaN; 转换对象都是NaN
Number(NaN) // NaN;
Number(!NaN) // 1;
Number(null) // 0;
Number(!null) // 1;
Number(!undefined) // 1;
Number(undefined) // NaN;

五、数组与数值

数组会先通过调用toString()转换为字符串后再转换为数值,比如[true]转换为字符串后为"true",然后再转换为数值是NaN,所以[true]==1返回false。

console.log([]==0);   // true
console.log([1]==1);   // true
console.log(["1"]==1);   // true
console.log([1,2]==1);   // false
console.log([true]==1);   // false
Number(['a']) //  NaN;
['1'] == 1 // true;

事实上,数组、对象和函数在与其他基本数据类型进行比较时都会先转换为字符串,然后再转换为相应的数据类型。

六、null == 0 、null >= 0 、null > 0

1.关系运算符知 和 相等运算符 并不是一个类别的.
2.关系运算符,在设计上总是需要运算元道尝试转为一个number,而相等运算符在设计上,则没有这方面的考虑.

null==0         //false
//解释:null在设计上,对比等于的时候不尝试转型. null和0不转型的话,是不会相等的, 所以null == 0结果为false.(在JavaScript旧版源代码中,没有相匹配的项,最后返回末尾的false。)

null > 0 // false
// 对比大于或小于的时候, null 会尝试转型为number , 转化之后null为0, 0>0是错误的,所以结果为 false.

null>=0 // true
null<=0 // true
//对比 大于等于 或 小于等于 的时候, 会先判断大于或小于,转型为number,0>0是错误的,但是0=0是正确的, 这是 “或” 的判断, 所以结果为 true

小结:

1.比较两个操作数相等时,有运算符根据运算符优先级,要先算==两侧的,然后再去强制转换类型,最后再去比较;
2.数组(对象,函数)会先通过调用toString()转换为字符串后再转换为数值
3.注意在比较时出现NaN,null,undefined时,不强制转换为数字类型
4.在关系运算符中,null,undefined会被Number()强制转换成数字类型;

  • 5
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值