·
- 发布:2023-12-19 15:36
- 更新:2024-01-05 19:33
- 阅读:294
产品分类: uniapp/App
PC开发环境操作系统: Windows
PC开发环境操作系统版本号: win10
HBuilderX类型: 正式
HBuilderX版本号: 3.98
手机系统: Android
手机系统版本号: Android 14
手机厂商: 华为
手机机型: nova6
页面类型: vue
vue版本: vue3
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
·
·
实际结果:
·
·
bug描述:
对数组进行判断,在某些情况下出现不准确的现象;
如下图1:
对象res是通过ajax返回来的object中的一个属性,其本身也应该是数组。但是通过获取构造函数“constructor”后于Array比较的出 false的结论。
定义对象 a 为一个数组,遍历res后,变元素push给a,同样方式判断a,它就是一个数组。
但是 打印 res.constructor 和 a.constructor 都的出结果是“function Array() { [native code] }”,但是res.constructor === Array 结果为false,而a.constructor === Array 则为 true;
图2:
图2是res的结构,以及来源。"res"来源于拦截器中"data"对象中的"data"属性
这就涉及到了内存地址不同导致的比较结果不同了。
uni对象和你本地定义的变量存在于不同的地方
首先两个数组对象直接打印的contructor当然是为Function Array.这是毋庸置疑的。
然而:强等于===比较的一般是内存的地址,本地和服务器的数组对象的constructor都各有自己的内存地址
你在res里面获取到数组示例,实际上是一个新的实例(经过序列化与反序列化处理之后),
因为res是在uni.request()方法那里构造出来的
所以res的constructor的内存地址指向的是uni的同一环境下的内存地址(假设为0000fff
而arr则是你本地另外一个内存环境内存地址(假设为0000fee
总结:这两个对象的constructor的内存地址是不同的。
const arr = [1];
console.log(arr.constructor === Array);// 0000fff === 0000fff 两个相等
console.log(arr.constructor);//function Array √
//res为服务器获取过来的数组对象
console.log(res.constructor === Array);// 0000fee === 0000fff 两个不相等
console.log(res.constructor);//function Array √
也就是说 res只有在服务器本地执行res.constructor===Array输出才为true