这行代码有什么问题?
req.body.location && req.body.location.type = 'Point'
我只想添加一个类型属性,但是我收到了错误
ReferenceError:赋值中的左侧无效
但这将有效
if(req.body.location) req.body.location.type = 'Point'
只是好奇并不是两个陈述意味着第一个不起作用的原因相同吗?
答案 0 :(得分:1)
TL; DR:使用req.body.location && (req.body.location.type = 'Point')
他们不是同一个陈述。这是一个类似但完整的例子:
const foo = {};
foo && foo.bar = 'baz';
让我们按order precedence分解。
&安培;&安培;在操作顺序是6级和= 3级,所以&&优先考虑。
因此,这部分代码首先运行:foo && foo.bar
。
foo && foo.bar
评估为未定义 - 现在不要担心细节问题。
所以你最终得到的是:undefined = 'baz'
这是不允许的。您无法在javascript中重新定义undefined
。
现在让我们考虑一下这段代码:
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()
。现在正常&&逻辑适用。它执行左侧,如果是,则执行右侧。所以runLater()然后将foo.bar设置为baz。考虑它有点棘手,因为括号占优势,但要创建这种占位符。