Javascript ReferenceError:分配中的左侧无效

Posted

技术标签:

【中文标题】Javascript ReferenceError:分配中的左侧无效【英文标题】:Javascript ReferenceError: Invalid left-hand side in assignment 【发布时间】:2018-10-02 10:29:17 【问题描述】:

这行代码有什么问题?

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

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

ReferenceError:分配中的左侧无效

但这会起作用

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

只是好奇,这两个语句的含义不一样,为什么第一个不起作用?

【问题讨论】:

试试req.body.location && (req.body.location.type = 'Point') console 中的我来说,它正在工作。 @CertainPerformance 你也可以翻转它req.body.location.type = 'Point' && req.body.location。没有? Node.js req 将永远存在。对于第二行。 Here is the fiddle.@CertainPerformance 是的。虽然看起来节省代码。 It works by the way due to precedence. () 在 20 个中获得了最高的 precedence&& 仅在 6 个中获得了 precedence。@CertainPerformance 因为&&precedence= 更高。所以它比较然后卡在= 分配。 () 得到了最高的 precedence 并使正确的块被视为 1。所以它工作得最好。 【参考方案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 - 我们现在不用担心细节。 所以你最终得到的是: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。考虑起来有点棘手,因为括号优先级更高,但要创建这种占位符。

【讨论】:

以上是关于Javascript ReferenceError:分配中的左侧无效的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 新函数作用域 ReferenceError

未捕获的 ReferenceError,通过 android 应用程序调用 javascript 函数..?

简单代码:JavaScript,未捕获的 ReferenceError:(x) 未定义

Javascript ReferenceError:分配中的左侧无效

未捕获的 ReferenceError:$ 未定义(PHP 中的 JavaScript/HTML)[重复]

ReferenceError StringBuilder 未在 javascript 中定义