2018-12-21 javascript 浅比较和深比较
2018-12-21 本文已影响0人
KingAmo
浅比较
浅比较
也称引用相等,在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