JS对象(数组)的复制疑问

题目描述

《JavaScript权威指南》【3.7不可变的原始值和可变的对象引用】部分,提到

对象的比较并非值的比较:即使两个对象包含同样的属性及相同的值,他们也是不相等的。

这个我觉得理解没问题,因为不是在一个内存里面,都是互相独立的。给的示例:

var o={x:1},p={x:1}; //具有相同属性的两个对象
o===p //=>false:两个单独的对象永远不相等
var a=[],b=[];  //两个单独的空数组
a===b  //=>false; 两个单独的数组永不相等

数组也是对象,而且都是单独声明的。
但是到后面的一个函数我就困惑了:

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;                         //否则他们相等
  }
}

对象相等应该是对象标识符的引用指向的是同一个内存地址吧?
即使用“=”方式让两个对象相等。
上面的例子只是判断了对象的“键值”对是一致的,不能证明a和b指向的是同一个内存地址啊?

阅读 1.9k
2 个回答

上文都说了

两个单独的数组永不相等

而这段函数的作用是

如果我们想比较两个单独的对象或数组

这个比较就不是要比较2个对象是否指向同一个内存了,而是要比较2个对象的属性或元素是否一致。

实际编程中我们判断2个数组或对象是否一致极少是为了要判断是否指向同一内存,大多数仅要判断属性或元素是否一致而已

就像书里面说的对象的比较都是引用的比较,当且仅当他们引用同一个基对象的时候,他们才相等,这一点是毋庸置疑的,那么我们使用==以及===都可以判断两个数组是否相等,为什么还要用这个函数呢?

一个函数的具体作用要看他的运行环境,同一个函数不同环境下产生的结果可能都是不同的。就拿equalArrays这个函数来说,看到他的代码实现,我们可以大致推断出,这个函数的作用是判断两个数组的值是否相等,而不是用来判断是否全等的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题