You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中Array.find()返回数组而非布尔值的原因及字符所属书写系统判断方案

问题1 为什么find()方法返回的不是布尔值

Array.prototype.find() 方法的原生定义就是返回数组中第一个满足测试条件的元素本身,无匹配项时返回undefined,本身就不会返回布尔值。
你之前用for...of的版本能正常运行,是因为匹配到的范围数组属于真值(truthy),if(isInRange)的判断刚好能生效,属于逻辑巧合,并非find返回了布尔值。

另外你用forEach的版本还有一个隐藏问题:forEach的回调函数内的return只会终止当前回调的执行,既不能中断forEach的遍历,也不能作为外层scriptOfSample函数的返回值,所以这个版本哪怕找到匹配项,最终也只会返回undefined。

问题2 调整代码的方案

判断是否存在符合条件的项,更适合用Array.prototype.some()方法,该方法会直接返回布尔值,存在符合条件的项返回true,否则返回false。下面提供两种可行实现:

方案1:用find遍历书写系统数组(推荐,性能更好)

function scriptOfSample(a, scripts) {
    const codePoint = a.codePointAt(0)
    // 找到第一个匹配的书写系统
    const matched = scripts.find(({ranges}) => {
        // 判断该书写系统的范围是否包含当前字符码点
        return ranges.some(([from, to]) => from <= codePoint && codePoint <= to)
    })
    return matched ? matched.name : undefined
}

方案2:坚持用forEach实现

function scriptOfSample(a, scripts) {
    const codePoint = a.codePointAt(0)
    let result = undefined
    scripts.forEach(({ranges, name}) => {
        // 已经找到结果就跳过逻辑,减少无意义计算
        if (result) return
        if (ranges.some(([from, to]) => from <= codePoint && codePoint <= to)) {
            result = name
        }
    })
    return result
}

该方案无法提前终止遍历,性能比方案1差,仅作为兼容写法参考。

内容的提问来源于stack exchange,提问作者Beru

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:01