微信小程序中基础库新增方法导致兼容性问题。。。头拿大

227 阅读3分钟

前言

你盼世界, 我盼望你无bug。Hello 大家好!我是杜梅拉!

这篇文章是一篇踩坑文,主要是记录自己踩的坑。

微信小程序

小程序在Android上,使用V8引擎解析和渲染 JavaScript; 而在iOS上,则是使用 JavaScriptCore.

以下关于Map数据结构在微信小程序中的异同

本文不讲Map的作用,好了,往下看(#^.^#)

1.基础库2.29.2以上的版本

image.png

2.小程序控制台

image.png

image.png

如图可知,Map的keys返回的是一个迭代器,迭代器下面有一条原型链,竟然新增了一些方法,当做数组去调用。

2.29.2调试基础库 对应的 微信客户端的版本必须大于8.0.31原型链上才会有新增的方法

3.客户端->我的->设置->检查更新->就能看到你的微信版本

image.png

问题来了

1.降低基础库 选择2.28.1

image.png image.png

image.png

往下降低了一个版本库

竟然发现原型链竟然少了一条Interator

由此可知为啥在控制台中会报错了,因为没有这条原型链,所以没有这个方法

也就是说微信版本如果是8.0.31以下是不支持使用Map中Iterator中的方法

运行浏览器端有这条原型链吗?

在谷歌控制台中

image.png

浏览器根本没有这条原型链,也就是说最新的微信前三的版本才有

因为我印象中一直都没有这个印象

再次确定,确实是微信小程序新增的。

问题来源追溯

有用户反馈说点击添加地址按钮没反应,添加不了无法下单,不经意间痛失百万订单 ̄□ ̄||

来看看添加地址中都写了啥,截取了一小段代码(#^.^#)

async function addAddress() {
		const nameFial = new Map([
			["user_name", "请输入收货人"],
			["phone", "请输入手机号码", ],
			["detail_info", "请输入详细地址", ],
			["city", "请选择省市区", ],
			["province", "请选择省市区", ],
			["county", "请选择省市区"]
		])
		const warndata = nameFial.keys().find(key => !formData.value[key])
		if (warndata) {
			return uni.showToast({
				image: `../../static/toast_fail@2x.png`,
				title: nameFial.get(warndata),
			})
		}

解决方法

nameFial.keys() 返回值是迭代器,

我记错了,以为返回的数组,所以才用find方法

不然肯定很多同学会有疑惑,find不是数组的方法吗,为啥用在迭代器身上,是我记错了以为keys返回的是数组

才导致问题产生

该死的啊,微信小程序偷偷加了一条原型链,本来是利于开发者的,误打误撞了冲进这条原型链,以为线上没报错没问题呢w(゚Д゚)w

所以只需要改动

[...nameFial.keys()]

把迭代器转成一个真正的数组就可以啦,该死ε=ε=ε=(#>д<)ノ


最后

如果一开始知道微信小程序大于8.0.31才新增了这条原型链,也不会导致问题的产生

一开始我就纳闷了,怎么有些线上有些没问题,有些不可以

我试了试自己的发现可以,以为是手机的版本太低导致,原来是微信已经自动更新最新版本

那些微信没有自动更新最新版本,版本小于8.0.31才会遇到这个问题

感谢

感谢各位看到最后

写下此文章目的是避免大家踩坑

睡觉了各位,晚安(๑′ᴗ‵๑)I Lᵒᵛᵉᵧₒᵤ❤