javascript ==与=== 浅比较和深比较

我们说深比较浅比较,首先要考虑变量的类型,如果变量的值是对象,那么浅比较就是比较对象在内存中的地址,如果变量的值是值类型比如1、2、3这样的,那么浅比较就是比较变量的值是否相同!

在说浅比较和深比较的区别之前,我们需要搞清楚==和===的区别,以及跟浅比较深比较的关系

==在比较双方的数据类型不同时,如果条件符合,会自动转换类型进行比较,而===数据类型不同,就直接返回false。

比如'1'==1 // true 和  '1'===1 // false

js中==和===区别

简单来说: == 代表相同, ===代表严格相同, 为啥这么说呢, 

这么理解: 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行===比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 如果类型不同,直接就是false.

 

操作数1 == 操作数2,  操作数1 === 操作数2

比较过程:

  双等号==: 

  (1)如果两个值类型相同,再进行三个等号(===)的比较

  (2)如果两个值类型不同,也有可能相等,需根据以下规则进行类型转换在比较:

    1)如果一个是null,一个是undefined,那么相等

    2)如果一个是字符串,一个是数值,把字符串转换成数值之后再进行比较

  

  三等号===:

  (1)如果类型不同,就一定不相等

  (2)如果两个都是数值,并且是同一个值,那么相等;如果其中至少一个是NaN,那么不相等。(判断一个值是否是NaN,只能使用isNaN( ) 来判断)

  (3)如果两个都是字符串,每个位置的字符都一样,那么相等,否则不相等。

  (4)如果两个值都是true,或是false,那么相等

  (5)如果两个值都引用同一个对象或是函数,那么相等,否则不相等

  (6)如果两个值都是null,或是undefined,那么相等

 

浅比较

浅比较也称引用相等,在javascript中, ===是作浅比较,只检查左右两边是否是同一个对象的引用

{a:1} === {a:1} // false

 

const m = {a:1};
const n = {a:1};
m === n //false

 

const m = {a:1};
const n = m;
m === n //true

 

const m = {a:1};
m === {a:1} //false

 

changeValue(params) {
  params.a = 2;
  return params;
}
const m = {a:1};
const n = changeValue(m);
m === n //true
m //{a:2}
n //{a:2}
ps: 这里`changeValue`方法直接修改了传入的参数`params`,这么做造成的后果是把  `m`的值也改变了
(因为javascript中,基本类型是传值调用,引用类型是传引用调用)
所以这种做法在`webstrom`中也会有警告,尽量不要这么做;

如果不同的变量名指向同一个对象,那么它们都是这个对象的引用,也就是说指向同一个内存地址。修改其中一个变量,会影响到其他所有变量。

这种引用只局限于对象,如果两个变量指向同一个原始类型的值。那么,变量这时都是值的拷贝。

 

1 === 1 //true

 

const m = 1;
const n = 1;
m === n //true

 

const m = 1;
const n = m;
m === n //true

 

changeValue(params) {
  params = params + 1;
  return params;
}
const m = 1;
const n = changeValue(m);
m === n //false
m //1
n //2

深比较

深比较也称原值相等,深比较是指检查两个对象所有属性是否都相等,深比较需要以递归的方式遍历两个对象的所有属性,操作比较耗时,深比较不管这两个对象是不是同一对象的引用。
javascript没有提供深比较的api,需要自己实现,网上有很多,具体查一下吧

 

deepEqual(a,b) {...} //假设这是深比较的具体实现 
const m = {a:1};
const n = {a:1};
deepEqual(m,n) // true
const x = {a:1, b: {c:1}};
const y = {a:1, b: {c:1}};
deepEqual(x,y) //true
只要两个对象的所有属性都相等,深比较就返回true

 

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hzxOnlineOk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值