work-notes(19):JS 引用类型数据,明明输出可以看得到数据,为什么取值却为空,或者对值判断或操作时 undefined 找不到?

时间:2022-06-28

摘要

就是明明数组、对象等可以输出看得到数据,但取不到值;取值都是 undefined ;

因为这些都是引用类型数据,代码写的是在操作之后输出,但是实际上在操作之前进行输出,所以为空;

为什么能输出:
因为只是简单的 = (赋值),指向地址,数据可以输出,但是实际上输出的变量是没有存值的;

问题描述

今天写代码的时候发现了个大问题;

1、数组数据是通过封装的函数获取的;

2、log 输出数组 可以得到数据;

3、但在进行操作时却拿不到数据,
   比如说类型判断,或者 arr.includes(xxx)是否在数组内时,返回都是为 false;
   
整体使用vue2.0写的;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这个是我封装的函数,也有问题;
在这里插入图片描述

问题解析

1、首先说我封装的函数;

(1)封装的函数,里面 projectPageListzhx({}) 用到了 then() 是一个异步请求;

(2)我这里先声明了数组 proIds 接收,然后 return 出去;看似没毛病实际大得很;

(3)异步请求,实际上中间相当于一个 定时器(setTimeout类型),即后面代码 return 了,
	上面的请求还不一定执行完;(所以这个函数返回一个空置)
	
(4)所以 typeOf 输出为 undefined;

解决思路

1、通过深拷贝方式;
	(1)通过递归方式;
	(2)JSON.parse(JSON.stringify(obj));
	(3)jQuery.extend() 函数;

2、多用 async await

这里重点讲 async await

1、使用 async await

这个函数执行,当声明了 proIds 空数组后,会等待 await 代码执行完毕;确保了 return 是有数据的;

使用后:
在这里插入图片描述
使用前:
在这里插入图片描述

2、取出数据

1、如果你直接 log 输出可以看见是一个 promise 对象;

2、如何取出很简单,在取出之前套一层 await 即可;虽然看似复杂但是能保证代码质量;
	也比处理异步操作简单多了;

直接输出为 promise 对象
在这里插入图片描述

解析获取直接数据,套一个 await在前面
在这里插入图片描述
后面的 includes 就能获取到数组内的数据,如果有就返回 ture了;
没加 async await 之前弄了很久都是 false 而且输出还显示有数据;

标注

1、用了 async await 就不用使用 then() 方法了;可返回去看我没用了;

总结

1、对于引用类型数据,当只是简单的浅拷贝 特别例如赋值(=)的方式时,可能导致取不到值;

2、异步请求时,相当于定时器执行,后面的代码可能都已经执行了,前面的还没有执行;
所以相当于在操作之前输出,导致输出找不到;
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,你的问题是如何在reserve中建立一个触发器,在数据插入reserve之前,根据r_out_num对应work表的work_start和renshu进行操作,是吗? 首先,你需要在reserve表中创建一个BEFORE INSERT触发器。在触发器中,你可以通过使用NEW关键字来引用即将插入reserve表的行数据。然后,你需要使用SELECT语句来查询work表中与r_out_num相对应的work_start和renshu字段值。你可以使用DATE_FORMAT函数来格式化r_out_num和work_start字段值的日期间,以便进行比较和匹配。接下来,你可以使用IF语句来检查当天的renshu是否有可预约的间。如果有可预约的间,则将r_out_num-1存储到reserve表中。如果当天没有可预约的间,则触发器将中止插入操作,并返回错误消息。最后,你需要使用END语句来结束IF语句和触发器。 下面是一个简单的示例代码,帮助你理解触发器的实现过程: ```sql CREATE TRIGGER tr_reserve_insert BEFORE INSERT ON reserve FOR EACH ROW BEGIN DECLARE v_work_start DATETIME; DECLARE v_renshu INT; SELECT work_start, renshu INTO v_work_start, v_renshu FROM work WHERE DATE_FORMAT(work_start, '%Y-%m-%d %H:%i') = DATE_FORMAT(NEW.r_out_num, '%Y-%m-%d %H:%i'); IF v_renshu > 0 THEN SET NEW.r_out_num = NEW.r_out_num - INTERVAL 1 DAY; ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'No available space for reservation on this day'; END IF; END; ``` 希望这个示例代码能够帮助你解决你的问题。如果你有任何其他问题,请随问我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值