如何尽可能简化条件判断?JS条件判断代码等效性疑问
问题解析与代码优化
嘿,我来帮你理清这个逻辑问题~
首先明确你的核心需求:你需要判断 r.user.id 或者 r.user.uid 是否等于 getUser.uid,同时要避免因 r.user 不存在而触发的报错。
为什么你的简化代码不符合预期?
你写的这段代码:
if (r?.user?.id||uid === getUser?.uid) { ... }
有两个关键问题:
- 优先级错误:逻辑或
||的优先级低于相等运算符===,所以这段代码实际执行的是(r?.user?.id) || (uid === getUser?.uid)。这里的uid是未定义的变量(你没有给它加r.user.前缀),完全不是你想要的r.user.uid。 - 返回值不是布尔值:
r?.user?.id如果存在(比如例子里的"toto"),它是一个非空字符串,在逻辑或运算中会直接返回自身(而不是转换为布尔值true),这就是你看到输出是"toto"的原因。
你的代码和原代码是否等效?
完全不等效。原代码的逻辑是:
- 先确保
r.user存在 - 再判断「
r.user.id等于getUser.uid」或者「r.user.uid等于getUser.uid」
而你的代码逻辑是:
- 如果
r.user.id存在,直接返回它的值(视为true) - 否则判断一个未定义的
uid是否等于getUser.uid
两者的运行逻辑完全不同,结果自然也不一致。
正确的简化代码
原代码可以利用可选链(?.)的特性来简化,因为可选链本身会在链上的某个值不存在时返回 undefined,不会触发报错,所以可以去掉冗余的 r.user && 判断:
let getUser = { uid: "123" }; let r = { user: { id: "toto", uid: "123"}}; // 简化后的代码,和原代码行为完全一致 if (r?.user?.id === getUser?.uid || r?.user?.uid === getUser?.uid) { console.log("条件成立"); }
如果想进一步提升可读性,可以把 r?.user 提取成变量,避免重复书写:
const user = r?.user; if (user?.id === getUser?.uid || user?.uid === getUser?.uid) { console.log("条件成立"); }
验证示例
在你的测试案例中:
r.user.id是"toto",不等于getUser.uid的"123"r.user.uid是"123",等于getUser.uid
所以简化后的代码会正确进入条件分支,和原代码的运行结果完全一致。
内容的提问来源于stack exchange,提问作者DenisMasot
相关产品推荐
相关产品推荐

