为何`req.body.location && req.body.location.type = 'Point'`报ReferenceError错误?
为什么两种写法效果不同?
这个问题其实是JavaScript的运算符优先级和赋值规则在“搞事情”,我来给你拆解清楚:
1. 第一种写法报错的核心原因
你写的req.body.location && req.body.location.type = 'Point',问题出在运算符优先级上:
- JavaScript中,逻辑与运算符
&&的优先级比赋值运算符=更高。所以JS会先计算req.body.location && req.body.location.type这个表达式,然后尝试把'Point'赋值给这个表达式的结果。 - 但赋值操作的左边必须是一个可被赋值的引用(比如对象属性、变量名这类“容器”),而
req.body.location && req.body.location.type的结果是一个具体的值(如果req.body.location存在,此时type还没定义,结果就是undefined;如果之前有type属性,就是它的当前值)—— 你没法给一个“值”再赋值,这就触发了ReferenceError: Invalid left-hand side in assignment错误。
2. 第二种写法正常运行的原因
if(req.body.location) req.body.location.type = 'Point'的逻辑就清晰多了:
- 先通过
if判断req.body.location是否存在,只有当条件为真时,才执行后面的赋值语句。 - 此时赋值的左边是
req.body.location.type,这是一个明确的对象属性引用,属于合法的可赋值左值,JS可以正常给这个属性赋值,自然不会报错。
3. 想要简洁写法?可以这么改
如果你想用类似第一种的简洁短路写法,只需要给赋值部分加个括号,改变运算优先级:
req.body.location && (req.body.location.type = 'Point')
这样&&会先判断左边的req.body.location是否为真,为真时才执行括号里的赋值操作——括号里的req.body.location.type = 'Point'是一个合法的赋值语句,左边是对象属性引用,完全没问题。
内容的提问来源于stack exchange,提问作者Madeline Ries
相关产品推荐
相关产品推荐

