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
相关产品推荐
相关产品推荐

