对象的比较并非值的比较: 即使两个对象包含同样的属性及相同的值, 它们也是不相等的。各个索引元素完全相等的两个数组也不相等。
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; // 否则它们相等; }