JavaScript中&&运算符优先级、执行顺序及代码报错问题咨询
为什么会报
result is not defined?聊聊JavaScript中&&的优先级与执行顺序 兄弟,你踩的这个坑本质上是运算符优先级在搞鬼,跟你以为的“从左到右顺序求值”不是一回事!
先给你拆解原始代码的执行逻辑:
while ( result = iterator.next() && !result.done ) { console.log( result.value ) }
你可能以为这段代码会先把iterator.next()的结果赋值给result,再判断!result.done,但实际上,JavaScript里&&的优先级比赋值运算符=高得多——&&的优先级是6,=只有3。所以这个表达式会被JS引擎自动解析成:
result = (iterator.next() && !result.done)
那具体执行顺序就变成了:
- 先执行
iterator.next(),拿到迭代器的结果对象(比如第一次是{value: 's', done: false}) - 接下来要计算
&&右边的!result.done——但这时候result还没被赋值过啊!它根本不存在,JS引擎自然就抛出ReferenceError: result is not defined了。
再看你修改后的代码:
while ( ( result = iterator.next() ) && !result.done ) { // ... }
这里的括号()强制改变了执行顺序,让赋值操作result = iterator.next()先完成:
- 先把
iterator.next()的结果赋值给result,现在result是一个有value和done属性的对象了 - 再用这个已经存在的
result去判断!result.done,逻辑就完全通顺了,自然不会报错。
简单总结一下:
- 不要想当然地依赖“从左到右”的执行顺序,运算符优先级才是决定表达式执行顺序的核心
- 当赋值操作和逻辑运算符混合时,一定要用括号明确你想要的执行顺序,避免优先级坑
内容的提问来源于stack exchange,提问作者coool
相关产品推荐
相关产品推荐

