为何JavaScript中"123".split('')与[1,2,3].join('').split('')不相等?
为什么数组对比返回false?
哈哈,这个问题其实是JavaScript里引用类型比较的经典坑!我来给你掰扯清楚~
核心原因:数组是引用类型,===对比的是引用地址
在JavaScript里,数组、对象这类属于引用类型。当你用===(或者==)比较两个引用类型的值时,它不会去逐一对比内部的元素内容,而是检查这两个值是否指向内存中的同一个对象。哪怕两个数组的元素完全一模一样,只要它们是独立创建的(比如两次调用split生成的数组),它们的内存引用地址就不同,对比结果自然是false。
看你的代码细节:
var arr = [1, 2, 3]; var str = "123"; function compare(){ return arr.join('').split('') === str.split('') } console.log(compare()); // false console.log(arr.join('').split('')) // ["1","2","3"] console.log(str.split('')); // ["1","2","3"]
arr.join('').split('')会生成一个新的数组对象["1","2","3"]str.split('')会生成另一个完全独立的数组对象["1","2","3"]
这两个数组内容看起来一样,但本质是两个不同的对象,所以===对比返回false。你甚至可以测试console.log(arr.join('').split('') === arr.join('').split('')),结果也是false——因为每次调用split都会创建新数组。
如何正确对比数组内容?
如果需要判断两个数组的内容是否一致,可以用这些方法:
方法一:转成字符串对比(简单场景)
既然你本来就是从字符串转换过来的,直接对比字符串更高效:function compare(){ return arr.join('') === str }方法二:遍历数组逐个对比(通用可靠)
手动检查数组长度和每一项的内容,适合所有场景:function compare(){ const arr1 = arr.join('').split(''); const arr2 = str.split(''); if (arr1.length !== arr2.length) return false; for (let i = 0; i < arr1.length; i++) { if (arr1[i] !== arr2[i]) return false; } return true; }方法三:用
Array.every简化遍历(ES6+)
用数组的every方法更简洁:function compare(){ const arr1 = arr.join('').split(''); const arr2 = str.split(''); return arr1.length === arr2.length && arr1.every((item, idx) => item === arr2[idx]); }方法四:JSON序列化(仅限简单数组)
如果数组元素都是基本类型(字符串、数字、布尔值),且没有顺序问题,可以用JSON.stringify:function compare(){ return JSON.stringify(arr.join('').split('')) === JSON.stringify(str.split('')); }注意:这个方法有局限性,比如数组里有
undefined、函数、嵌套对象时,序列化结果会出错,不推荐复杂场景使用。
内容的提问来源于stack exchange,提问作者buzz
相关产品推荐
相关产品推荐

