变量赋值逻辑运算符未触发默认值:state未定义报错咨询
老哥你踩的这个坑其实很多刚接触JS的同学都会碰到——不是||运算符没用,而是当state本身都未定义的时候,JS会直接抛出引用错误,根本轮不到||去执行默认值逻辑。
问题根源
var borough = state.city.borough || 'Manhattan'; 这段代码的执行逻辑是先尝试访问state.city.borough,但如果state这个变量压根就没定义,JS引擎在解析state的时候就会直接抛出Uncaught ReferenceError: state is not defined,完全走不到后面的|| 'Manhattan'这一步。||只能处理“变量存在但值为假(比如undefined、null、''、0等)”的情况,没办法处理“变量本身不存在”的场景。
解决方案
根据你的需求(state或其任意子键不存在时都能返回默认值),这里有几种靠谱的方案:
1. 用ES2020+的可选链操作符(最推荐)
可选链?.可以安全地访问嵌套对象的属性,如果链上的某个节点不存在(比如state未定义、state.city是null),就会直接返回undefined,不会报错。配合||或者空值合并运算符??就能实现需求:
// 如果borough可能是假值(比如空字符串),用||会把假值也替换成默认值 const borough = state?.city?.borough || 'Manhattan'; // 如果只想在borough是null/undefined时才用默认值,用??更精准 const borough = state?.city?.borough ?? 'Manhattan';
??和||的区别是:??只对null和undefined生效,不会把0、''、false这些假值替换成默认值,更适合需要保留合法假值的场景。
2. 兼容老版本JS的逐层判断方案
如果你的项目还需要兼容不支持ES2020的环境,就得手动逐层检查每个节点是否存在:
let borough = 'Manhattan'; // 先检查state是否存在,再检查city,最后检查borough if (typeof state !== 'undefined' && state.city && state.city.borough) { borough = state.city.borough; }
这里用typeof state !== 'undefined'是因为直接写if (state)的话,如果state是null或者0也会进入默认值,但你需要的是“变量不存在”的情况,所以用typeof判断更准确。
内容的提问来源于stack exchange,提问作者user3006927

