Javascript ReferenceError:分配中的左侧无效

Javascript ReferenceError:分配中的左侧无效,javascript,Javascript,这行代码怎么了 req.body.location && req.body.location.type = 'Point' 我只想添加一个类型属性,但出现错误 ReferenceError:赋值中的左侧无效 但这会奏效的 if(req.body.location) req.body.location.type = 'Point' 好奇的是,这两种说法的意思不一样吗?为什么第一种说法不起作用;DR:使用req.body.location&(req.body.location.t

这行代码怎么了

req.body.location && req.body.location.type = 'Point'
我只想添加一个类型属性,但出现错误

ReferenceError:赋值中的左侧无效

但这会奏效的

if(req.body.location) req.body.location.type = 'Point'

好奇的是,这两种说法的意思不一样吗?为什么第一种说法不起作用;DR:使用
req.body.location&(req.body.location.type='Point')

它们不是同一种说法。下面是一个类似但完整的示例:

const foo = {};
foo && foo.bar = 'baz';
让我们把它分解为。 &&在操作顺序上为6级,=为3级,因此&&优先。 因此,这部分代码首先运行:
foo&&foo.bar
foo&&foo.bar
计算结果为未定义-我们现在不必担心细节。 因此,最终的结果是:
undefined='baz'

这是不允许的。不能在javascript中重新定义
未定义的

现在让我们考虑这个代码:

const foo = {};
if (foo) {
  foo.bar = 'baz';
}
if表达式优先,后跟赋值

要修复原始语句,可以在&&操作周围添加括号。这与JS或JSX无关,只是与javascript的工作方式无关

给定
foo&&(foo.bar='baz')
首先,括号在级别20时优先。这就像制作一个尚未执行的占位符变量。大概是这样的:

const runLater = () => (foo.bar = 'baz');
foo && runLater()
显然,这并不是由于作用域问题而发生的情况,但从伪代码的角度看,您正在将语句折叠为占位符


现在我们有了
foo&&runLater()
。现在应用正常的&&逻辑。它执行左侧,如果为true,则执行右侧。因此runLater()然后将foo.bar设置为baz。考虑这一点有点棘手,因为括号的优先级更高,但要创建这种占位符。

尝试
req.body.location&&(req.body.location.type='Point')
。对于我来说,在
控制台中它正在工作@某些性能您还可以翻转它
req.body.location.type='Point'&&req.body.location
。不是吗?Node.js
req
将始终存在。第二行@一定要有表现啊。不过看起来代码节省了
()
获得了20个中最高的
优先级<代码>&
只有6的
优先级@某些性能是因为
&
优先级高于
=
。因此,它进行比较,然后在
=
赋值时卡住
()
获得了最高的
优先级
,并将右侧块视为1。所以它工作得最好。