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.bar
。
foo && 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:分配中的左侧无效