微信小程序开发工具,代码被优化而引起的一个诡秘的bug
- 2026-09-24 08:28:20
微信小程序开发工具,代码被优化而引起的一个诡秘的bug最近迭代小程序功能,无疑中发现一个bug,通过调试修正后,发现这个问题有点意思,被坑的感觉,记录下。 问题是这样的,在手机微信上使用自己开发的小程序的打谱功能,记谱之后发现棋谱打不开——一定是数据错误了,bug。 在“微信开发者”工具测试,发现这个功能正常,诡秘了。 再通过“真机调试”功能再试,“真机调试”出错了。(“微信开发者”直接测试正常,真机调试出错) 加日志,调试咧~ 先说下棋谱记录功能,一个棋子从坐标(a,b) 移动到坐标(c,d),算法上行子记录:"abcd"。比如从坐标(1,2) 走到(3,4),那么移动的数据表示为"1234"。 再说个全宇宙都知道的js知识:字符串加数字,等于字符串和数字拼接。如果我们想把var a = 8 转为字符串形式,最简单的做法就是 var res = "" + a即得到字符串“8”。 本人前端菜鸟,当时做行子的记录拼接,是这样: 如果moves (经过计算后)为: 那么得到结果,应该是这样吧: 在老版本,一直到没有问题的,但现在却出现问题,调试“真机调试”结果得到: 这是啥鬼? (能现在看出问题的,前端高手。显然我不是。)加日志跟踪看看。 下图,加了红色日志代码。 
继续“真机调试”,结果得到:7747706279678070897910227973。 我去~,也就是说加了日志之后,数据正常了。 再去掉上面日志,继续出错(得到2515291533526)。这是量子力学问题啊?!观察和不观察,还能得到不一样的结果?(直接IED跑没有问题;真机调试出问题;真机调试加日志,没有问题) 调整下日志(拼接前打印fromX、Y和toX、Y,拼接之后打印res),再每一个循环之后打印一次结果看看: 
终于发现特点了: 也就是说,每次把(a,b,c,d) 四元素加起来,再拼接到res去了。 即是,原来的: 被优化成了: 用一个数据来看,假如 (fromX,fromY,toX,toY) = (7,7,4,7),我们期望: 但实际被优化为: 难怪前面加日志,就没有问题——中间插入日志,IED没法对代码进行优化。 为什么以前没有这个问题?突然想起,前不久升级了下开发者工具……应该是这个聪明的IED做的好事了。 好了,知道原因之后,修改这个问题就简单了:比如res += "" + fromX 就可。 当然,这次改为更为雅观的写法: 这次应该没有坑了吧。
var res = "";for from, to in moves { // 伪代码,遍历行子记录// 计算行子的原位置和目标位置:fromX, fromY, toX, toYres += fromX;res += fromY;res += toX;res += toY;}return res;
[(7,7,4,7),(7,0,6,2),(7,9,6,7),(8,0,7,0),(8,9,7,9),(1,0,2,2),(7,9,7,3)]77477062796780708979102279732515291533526

[(7,7,4,7),(7,0,6,2),(7,9,6,7)……]// 挨次拼接25,15,29// 也就是25=7+7+4+7,15=7+0+6+2,29=7+9+6+7……// 结果251529……
res += fromX;res += fromY;res += toX;res += toY;
res += fromX + fromY + toX + toY;res = "";// 正常应该这样,res += 7;// res = "7";res += 7;// res = "77";res += 4;// res = "774";res += 7;// res = "7747";
var res = "";res += 7 + 7 + 4 + 7; // res="25"
ret += `${fromX}${fromY}${toX}${toY}`;
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。