为何this.byPassViewState === ['01']返回false?请指出错误
为什么数组内容相同但
===比较返回false? 嘿,这其实是JavaScript里引用类型比较的经典坑,我来给你掰扯清楚:
核心原因:数组是引用类型,===比的是内存地址
在JavaScript里,数组属于引用类型(和对象、函数一样)。当你用===比较两个引用类型的值时,它不会去对比里面的内容,而是看这两个值是不是指向内存里的同一个对象实例。
你控制台打印this.byPassViewState得到["01"],手动写的['01']看起来内容一样,但它们是两个完全独立的数组对象——一个是你代码里已经存在的this.byPassViewState,另一个是你在比较时临时创建的新数组,它们在内存里的存储地址不一样,所以===自然返回false。
举个更直观的例子:
const a = ['01']; const b = ['01']; console.log(a === b); // 输出 false,因为a和b是两个不同的数组实例
另外你提到typeof(this.byPassViewState)返回object,这也是正常的——JavaScript里数组本质上就是特殊的对象,如果你想准确判断某个值是不是数组,应该用Array.isArray(this.byPassViewState),它会返回true。
正确比较数组内容的方法
如果想判断两个数组的内容是否完全一致,可以用下面几种方式:
用
JSON.stringify快速对比(适合简单数组)
把两个数组转成JSON字符串再比较,适合数组里没有函数、undefined、NaN这类特殊值的场景:console.log(JSON.stringify(this.byPassViewState) === JSON.stringify(['01'])); // 输出 true手动遍历对比(更可靠)
自己写一个遍历函数,逐个对比数组元素和长度,能处理更多复杂场景:function areArraysEqual(arr1, arr2) { if (arr1.length !== arr2.length) return false; for (let i = 0; i < arr1.length; i++) { // 如果元素是嵌套数组/对象,这里需要递归对比,不过你的场景里是字符串,直接比就行 if (arr1[i] !== arr2[i]) return false; } return true; } console.log(areArraysEqual(this.byPassViewState, ['01'])); // 输出 true
内容的提问来源于stack exchange,提问作者Arun K
相关产品推荐
相关产品推荐

