2***@qq.com
2***@qq.com
  • 发布:2023-12-19 15:36
  • 更新:2024-01-05 19:33
  • 阅读:294

【报Bug】instanceof Array 在某种情况下出错

分类:uni-app

产品分类: 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"属性

2023-12-19 15:36 负责人:无 分享
已邀请:
HRK_01

HRK_01

这就涉及到了内存地址不同导致的比较结果不同了。
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

要回复问题请先登录注册