我有个语法问题很迷惑,关于Set

我是在目前最新的3.7.0上测试的,有这么一段代码,很简单,找一个Set是否是另一个Set的子集:

export function isSubSet(childSet: Set<unknown>, parentSet: Set<unknown>) {
    let result = [...childSet].every(o => parentSet.has(o));
    console.log('set', JSON.stringify(Array.from(childSet)), '是 set', JSON.stringify(Array.from(parentSet)), '的子集吗?', `${result ? '是' : '否'}`);
    return result;
}

其实只有一行,我发现很迷惑就加了一堆log。
这段代码在编辑器直接运行是正常的,可以正确找出前面是后面的子集。但是只要发布出来。就永远返回false。
自然的,我怀疑[…childSet]那里的事。
那到底是为什么会造成运行差异呢?

另一段测试在Edge里面:
image

我改成这个就行了:
let result = Array.from(childSet).every(o => parentSet.has(o));
不理解。

有看看打包后 […childSet] 打印出来是什么吗?

印象里之前有一次要对 Mapkeys 转数组做遍历也遇到过,浏览器正常,打包后出错,这种迭代器类型的数据转数组,最好是用 Array.from 去转数组,不要用解构。

猜想可能是打包后 ts 转 js 导致哪里出问题了吧,之前研究过,忘记什么原因了:joy:

翻了下提交记录,当时发现是打包微信小游戏后,[...Map.keys()] 返回的是迭代器数组,而不是期望的 key 数组,用 Array.from(Map.keys()) 就没问题。

为了性能和包体,编译出来的并不是和 ES6 原生 [...new Set()] 的一毛一样。见: Compiler assumptions · Babel (babeljs.io)

可以试着取消掉项目设置里面的宽松模式试试,如果还不行,有可能是引擎的宽松模式出了问题,或者是微信开发者工具二次编译导致。