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

JS中逻辑或(OR)是否短路?数组操作报错的排查与解决

JavaScript逻辑运算与数组操作问题解答

疑问1:逻辑或(||)的短路求值特性

在JavaScript中,||运算符是短路求值的——如果第一个条件的结果为true,就会直接跳过后面的所有条件判断,不会再执行后续表达式。

对应你的代码来说,如果kozvetlenFl.length === 0为真(数组为空),后面的kozvetlenFl.findIndex(...) === -1根本不会运行,直接进入push逻辑。这是JS的默认优化行为,能避免不必要的计算。

疑问2:解决Cannot read property 'id' of undefined报错

这个错误的根源是:你执行feladatok.find(feladat => child === feladat.id)时,可能找不到匹配child的项,导致返回undefined,然后你把这个undefinedpush进了kozvetlenFl数组。之后当数组不为空时,kozvetlenFl.findIndex(feladat => feladat.id === child)遍历到undefined时,尝试访问它的id属性就会抛出错误。

修复方案:

先确保要添加的项存在,再执行重复检查和push操作,优化后的代码如下:

//... 
let kozvetlenFl = [];
// 先获取要添加的目标项,避免重复查找
const targetFeladat = feladatok.find(feladat => feladat.id === child);

// 只有找到有效项时,才进行后续操作
if (targetFeladat) {
  // 检查数组中是否已有相同id的项
  const isDuplicate = kozvetlenFl.some(item => item.id === child);
  if (!isDuplicate) {
    kozvetlenFl.push(targetFeladat);
  }
}
//...

代码说明:

  1. 先通过targetFeladat缓存查找结果,避免重复遍历feladatok数组,提升性能。
  2. 用if (targetFeladat)确保只有找到有效项时才继续,避免把undefined推入数组。
  3. 用some()方法判断是否存在重复项,语义更清晰;你也可以继续用findIndex() !== -1,效果是一样的。
  4. 原逻辑中的“数组为空”情况已经被包含在!isDuplicate里了——空数组的some()会返回false,所以!isDuplicate为true,会执行push,完全符合你的需求。

内容的提问来源于stack exchange,提问作者Gergő Horváth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:29:18