uni-app中ES2022新增的findLast()方法运行到Android APP基座时报TypeError: xxx.findLast is not a function
uni-app中ES2022新增的findLast()方法运行到Android APP基座时报TypeError: xxx.findLast is not a function
代码中使用ES2022新增的findLast()方法,运行到iOS APP基座时,方法正常调用。运行到Android APP基座时,方法调用报错:TypeError: xxx.findLast is not a function。
运行的真机:苹果 12、红米 5 Plus 不知道是手机的原因还是编译的原因导致这个问题。
在uni-app开发中,遇到TypeError: xxx.findLast is not a function
这类错误通常是因为目标环境(如Android APP基座)不支持某些较新的JavaScript特性。findLast()
方法是ES2022中新增的数组方法,用于从数组的末尾开始查找第一个满足提供的测试函数的元素。然而,并不是所有的JavaScript环境都会立即支持最新的ECMAScript标准。
为了解决这个问题,你可以在uni-app项目中避免直接使用findLast()
方法,而是使用传统的循环结构或者polyfill来实现相同的功能。下面是一个使用polyfill来模拟findLast()
方法的示例代码,这样可以确保代码在不同环境下都能正常运行:
// 如果当前环境不支持 findLast 方法,则添加 polyfill
if (!Array.prototype.findLast) {
Array.prototype.findLast = function(predicate) {
// 1. Let O be ? ToObject(this value).
const o = Object(this);
// 2. Let len be ? ToLength(? Get(O, "length")).
const len = o.length >>> 0;
// 3. If IsCallable(predicate) is false, throw a TypeError exception.
if (typeof predicate !== 'function') {
throw new TypeError(`${predicate} is not a function`);
}
// 4. Let k be len - 1.
let k = len - 1;
// 5. Repeat, while k ≥ 0
while (k >= 0) {
// a. Let Pk be ! ToString(k).
// b. Let kPresent be ? HasProperty(O, Pk).
// c. If kPresent is true, then
// i. Let kValue be ? Get(O, Pk).
// ii. Let testResult be ToBoolean(? Call(predicate, undefined, [« kValue, k, O »])).
// iii. If testResult is true, return kValue.
if (predicate(o[k], k, o)) {
return o[k];
}
k--;
}
// 6. Return undefined.
return undefined;
};
}
// 使用示例
const numbers = [1, 2, 3, 4, 5];
const found = numbers.findLast(n => n > 3);
console.log(found); // 输出: 5
上述代码首先检查Array.prototype.findLast
是否存在,如果不存在,则定义该方法。这样,即便在不支持findLast()
的Android APP基座环境中,代码也能正常运行。使用这种方法可以确保你的uni-app应用在不同平台上的兼容性。