JavaScript同一if语句内先校验数组越界再访问元素的安全性与可靠性
你当前使用的逻辑与短路写法完全符合语言规范,安全可靠
运算符的固定执行规则
- JavaScript的逻辑与运算符
&&严格遵循从左到右顺序求值、左操作数优先执行的规则,写在判断最前面的accessible变量一定会被最先求值,不存在右段代码提前执行的可能。 - 只要左操作数
accessible的结果为假值(本例中为布尔false),就会触发短路机制:&&右侧拼接的所有数组访问、属性读取、函数调用操作完全不会被执行,自然也就不会触发下标越界的运行错误。
原示例代码的笔误提示
你提供的示例代码本身存在变量名写错的问题,直接运行会抛出引用错误,和短路逻辑无关:
- 定义的数组变量名是
some_array,但计算accessible时写的是array.length,此处的array未被定义,实际运行会直接报错。 - 修正后的可运行示例代码:
var some_array = ["11","22","33"] var access_index = 100 var accessible = some_array.length > access_index ? true : false if(accessible && some_array[access_index].substr(0,1) === "1") { console.log("ok") } else { console.log("not ok") }
上述代码运行时,由于accessible为false,后面对some_array[100]的访问和.substr()调用完全不会执行,最终会输出not ok,不会抛错。
常见认知误区澄清
- 不存在“JS会预先校验if条件内所有表达式”的逻辑,整个条件块的执行顺序完全按照书写顺序逐段推进,和其他主流编程语言的短路求值逻辑保持一致。
- 你当前把越界安全判断放在条件最前面、后续拼接数组访问的写法,完全满足“先校验accessible标记、再执行数组访问”的业务顺序要求,不需要额外拆成两层嵌套if写重复判断,运行逻辑和语法上都没有问题。
内容的提问来源于stack exchange,提问作者Sean
相关产品推荐
相关产品推荐

