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); } } //...
代码说明:
- 先通过
targetFeladat缓存查找结果,避免重复遍历feladatok数组,提升性能。 - 用
if (targetFeladat)确保只有找到有效项时才继续,避免把undefined推入数组。 - 用
some()方法判断是否存在重复项,语义更清晰;你也可以继续用findIndex() !== -1,效果是一样的。 - 原逻辑中的“数组为空”情况已经被包含在
!isDuplicate里了——空数组的some()会返回false,所以!isDuplicate为true,会执行push,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Gergő Horváth
相关产品推荐
相关产品推荐

