为何数组内容相同时second===third返回false?JS数组比较问题
为什么内容相同的数组用
===比较会返回false? 在JavaScript中,数组属于引用类型。===运算符对引用类型的比较逻辑是:判断两个变量是否指向内存中的同一个对象实例,而非比较它们的内容是否一致。
哪怕两个数组的元素、顺序完全相同,它们也是内存中独立的两个对象,所以second === third会返回false——这就是你遇到问题的核心原因。
解决方法:比较数组内容而非引用
因为你已经对两个数组做了排序,只需要验证它们的每一个元素是否对应相等即可,这里提供几种可行的方案:
方案1:循环逐个比较元素
function same(first, second) { // 先判断长度,长度不同直接返回false,避免后续无效操作 if (first.length !== second.length) return false; first.sort((a,b) => a-b); second.sort((a,b) => a-b); let third = first.map((a) => a**2); // 遍历每个索引,比较对应位置的元素 for (let i = 0; i < second.length; i++) { if (second[i] !== third[i]) { return false; } } return true; }
方案2:使用Array.every()方法
利用数组的every方法简洁实现逐个比较:
function same(first, second) { if (first.length !== second.length) return false; first.sort((a,b) => a-b); second.sort((a,b) => a-b); let third = first.map((a) => a**2); return second.every((val, index) => val === third[index]); }
方案3:转成字符串比较(适合简单元素场景)
如果数组元素都是基础类型(比如数字、字符串),可以把数组转成JSON字符串后比较:
function same(first, second) { if (first.length !== second.length) return false; first.sort((a,b) => a-b); second.sort((a,b) => a-b); let third = first.map((a) => a**2); return JSON.stringify(second) === JSON.stringify(third); }
额外优化提示
你的当前逻辑还有一个潜在问题:如果输入的两个数组长度不同(比如first是[1,2],second是[1,4,9]),排序后比较元素也会出错,所以先判断数组长度是否相等是很有必要的。
内容的提问来源于stack exchange,提问作者Alexius
相关产品推荐
相关产品推荐

