对象的比较

对象的比较并非值的比较: 即使两个对象包含同样的属性及相同的值, 它们也是不相等的。各个索引元素完全相等的两个数组也不相等。

var o = {x: 1}, p = {x: 1};  
  
o === p;     // false:   两个单独的对象永不相等!

var a = [], b = [];

a === b      // false:   两个单独的数组永不相等!

通常将对象成为引用类型,以此来和javascript的基本类型区分开来,对象的值都是引用,对象的比较均是引用的比较:当且仅当它们引用相同一个基对象时, 它们才相等。

var a = [];
var b = a;               // 变量b引用同一个数组
b[0] = 1;                // 通过变量b来修改引用的数组
a[0];                      // =>1: 变量a也会被修改
a === b                 // true: a和b引用同一个数组,因此它们相等

将对象(或数组)赋值给一个变量,仅仅是赋值的引用值:对象本身并没有复制一次。如果想得到一个对象或者数组的副本,则必须显示复制对象的每个属性或数组的每个元素。

var a = ['a', 'b', 'c'];    // 待复制的数组
var b = [];                 // 复制待的目前空数组

for(var i = 0; i < a.length; i++) {
    b[i] = a[i]             // 遍历a[]中的每个元素,复制到b中
}

console.log(b)              // ["a", "b", "c"]
console.log(a)              // ["a", "b", "c"]
 
b === a                     // => false  两个单独的数组永不相等

b.push(1)
console.log(b)              // ["a", "b", "c", 1]
console.log(a)              // ["a", "b", "c"]     // 复制后的a数组不受b数组的影响

如果我们想比较两个单独的对象或数组,则必须比较它们的属性或元素。定义一个比较两个数组的函数:

function equalArrays(a, b) {
    if(a.length != b.length) return false;    // 两个长度不相等的数组不相等
    for(var i = 0; i < a.length; i++) {
         if(a[i] !== b[i]) return false;      // 如果有任意元素不相等,则数组不相等;
    }         
    
    return true;                              // 否则它们相等;
}

猜你喜欢

转载自www.cnblogs.com/reactjs/p/9946652.html