uni-app中ES2022新增的findLast()方法运行到Android APP基座时报TypeError: xxx.findLast is not a function

发布于 1周前 作者 yibo5220 来自 Uni-App

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 不知道是手机的原因还是编译的原因导致这个问题。

1 回复

在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应用在不同平台上的兼容性。

回到顶部