uniapp踩坑,真机instanceof无法判断数组类型

697 阅读2分钟

需求描述

需要在app中做一个答题的功能,题目和选项后端随机传过来,所以选择判断题的分数需要前端计算,后端说自己不好算。 选项和答案都是数组,用户的答案也是以数组的形式保存的。

选项格式示例: "examinationAnswers":["1","bB","FDS","FDSFDS"]

正确答案实例: "rightAnswer":["1"]

用户答案实例: "userAnswer":["1"]

我的做法

其实就是对比一下两个数组,但是由于有多选题且用户点击顺序不确定,所以不能直接用 “===”来直接对比用户答案和正确答案。 我的思路如下:

第一步:判断两个参数是否都是数组格式,划重点 typeofe 是无法准确检测数组的,对于前端而言,我们用到的所谓数组,其本质是一种特殊的对象,所以检验这个数组要用 intanceof 方法

js中可以通过typeof操作符和instanceof操作符判断变量的类型。

而typeof在判断基本类型的变量时能精准判断。当变量是数组、对象时都只会返回‘object',无法准确的说明该对象是什么类型的。

但是instanceof基于原型链可以判断一个引用是否属于某构造函数。能弥补typeof 方法判断变量类型的缺点。

第二步,判断两个数组的长度

第三步,判断是否A的每一项都在B中

第四步,根据题型计算分数

arrCompare(a, b) {
      // 是否都为数组
      console.log('是否都为数组', a instanceof Array, b instanceof Array);
      console.log('判断长度是否一样', a.length, b.length);
      // 判断长度是否一样
      if (a.length != b.length) {
        return false;
      }
      var aStr = a.toString();
      // B的每一项是否都在A中
      for (var i = 0, len = b.length; i < len; i++) {
        if (aStr.indexOf(b[i]) == -1) return false;
        console.log('B的每一项是否都在A中', aStr.indexOf(b[i]) == -1);
      }
      return true;
    },arrCompare(a, b) {
      // 是否都为数组
      console.log('是否都为数组', a instanceof Array, b instanceof Array);
      console.log('判断长度是否一样', a.length, b.length);
      if (!(a instanceof Array) || !(b instanceof Array)) {
        return false;
      }
      // 判断长度是否一样
      if (a.length != b.length) {
        return false;
      }
      var aStr = a.toString();
      // B的每一项是否都在A中
      for (var i = 0, len = b.length; i < len; i++) {
        if (aStr.indexOf(b[i]) == -1) return false;
        console.log('B的每一项是否都在A中', aStr.indexOf(b[i]) == -1);
      }
      return true;
    },

写完了,在浏览器中测试了一下,没有发现问题。然后打包部署交给测试了,结果测试小姐姐告诉我,不管填的答案对不对,分数一直都是0 。

完了!一个一级阻塞性bug

image.png

发现问题

于是连上手机开始调试,我将每一步的值都输出发现,在app中instanceof判断数组竟然全是false,离了个大谱。终于找到原因了,如下图

image.png

谨以此纪念一下踩的坑