Javascript ReferenceError:赋值中的左侧无效

时间:2018-04-22 06:10:33

标签: javascript

这行代码有什么问题?

req.body.location && req.body.location.type = 'Point'

我只想添加一个类型属性,但是我收到了错误

  

ReferenceError:赋值中的左侧无效

但这将有效

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

只是好奇并不是两个陈述意味着第一个不起作用的原因相同吗?

1 个答案:

答案 0 :(得分:1)

TL; DR:使用req.body.location && (req.body.location.type = 'Point')

他们不是同一个陈述。这是一个类似但完整的例子:

const foo = {};
foo && foo.bar = 'baz';

让我们按order precedence分解。 &安培;&安培;在操作顺序是6级和= 3级,所以&&优先考虑。 因此,这部分代码首先运行:foo && foo.barfoo && 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。考虑它有点棘手,因为括号占优势,但要创建这种占位符。