JavaScript中如何让两个数组类型通过严格相等(===)判断为相等
问题本质
JS/TS中的数组属于引用类型,===和==对引用类型的默认比较规则都是判断两个变量是否指向同一块内存地址,不会对比数组内部的元素内容。
你遇到的==返回true、===返回false的情况,大概率是你的categoryIds实际为数字类型30而非数组:数组[30]和数字30做==比较时会触发隐式类型转换,数组先转成字符串"30"再转成数字30,因此返回true;而===不会做类型转换,数组和数字类型不同直接返回false。
实现方案
方案1:复用常量数组引用(满足严格相等判断要求)
如果要让===判断返回true,只要保证categoryIds和PhysicalPackageConst.nrtPatchCategory指向同一个数组即可,所有赋值场景直接复用常量引用,不要用[30]字面量重新生成新数组:
// 赋值时直接用常量,不要写 categoryIds = [30] categoryIds = PhysicalPackageConst.nrtPatchCategory; // 此时严格相等判断就会返回true if (categoryIds === PhysicalPackageConst.nrtPatchCategory) { this.materialTypes = PhysicalPackageConst.nrtPatchMaterialType; categoryIds = []; }
方案2:内容对比(适合动态生成数组的场景)
如果categoryIds是动态生成的,无法保证引用一致,建议直接修改判断逻辑对比数组内容,不需要强求用引用相等判断:
// 单元素数组判断写法 if (categoryIds.length === 1 && categoryIds[0] === PhysicalPackageConst.nrtPatchCategory[0]) { this.materialTypes = PhysicalPackageConst.nrtPatchMaterialType; categoryIds = []; } // 通用多元素数组判断写法 const isArrayEqual = categoryIds.length === PhysicalPackageConst.nrtPatchCategory.length && categoryIds.every((val, index) => val === PhysicalPackageConst.nrtPatchCategory[index]); if (isArrayEqual) { // 业务逻辑 }
内容的提问来源于stack exchange,提问作者user93
相关产品推荐
相关产品推荐

