34

我的石头剪刀布游戏(称为折腾)代码如下:

var toss = function (one,two) {
    if(one = "rock" && two = "rock") {
        console.log("Tie! Try again!");
    }
    // more similar conditions with `else if`
};

当我输入参数时

toss("rock","rock")

我得到这个错误代码:

“ReferenceError:分配中的左侧无效”

如何解决?这个错误是什么意思,还有什么其他情况会发生这个错误?

4

3 回答 3

57

您必须使用==来比较(甚至===,如果您想比较类型)。单=是分配。

if (one == 'rock' && two == 'rock') {
    console.log('Tie! Try again!');
}
于 2013-09-03T17:00:04.587 回答
10

错误的常见原因:

  • 使用赋值 ( =) 而不是相等 ( ==/ ===)
  • 分配给函数的结果foo() = 42而不是传递参数 ( foo(42))
  • 只是缺少成员名称(即假设一些默认选择):getFoo() = 42而不是getFoo().theAnswer = 42或数组索引getArray() = 42而不是getArray()[0]= 42

在这种特殊情况下,您想使用==(或者更好===- Javascript 中的 Type Coercion 到底是什么?)来检查是否相等(例如if(one === "rock" && two === "rock"),但您收到错误的实际原因更棘手。

错误的原因是Operator priority。特别是我们正在寻找&&(precedence 6) 和=(precedence 3)。

让我们根据优先级在表达式中添加大括号 -&&高于=因此它首先执行,类似于以下3+4*5+6操作3+(4*5)+6

 if(one= ("rock" && two) = "rock"){...

现在我们有类似于多个赋值的表达式a = b = 42,由于从右到左的关联性,执行为a = (b = 42). 所以添加更多的大括号:

 if(one= (  ("rock" && two) = "rock" )  ){...

最后我们遇到了实际问题:("rock" && two)不能评估为可以分配给的 l 值(在这种特殊情况下,它的值为two)。

请注意,如果您使用大括号将每个“平等”周围的感知优先级与大括号匹配,则不会出现错误。显然,这也会产生与您预期不同的结果 -由于逻辑 &&&&的行为,这两个变量的值都发生了变化,而不是在两个字符串上"rock" && "rock"发生了变化"rock"(这反过来又是真实的):

if((one = "rock") && (two = "rock"))
{
   // always executed, both one and two are set to "rock"
   ...
}

有关错误的更多详细信息以及可能发生的其他情况 - 请参阅规范:

任务

LeftHandSideExpression = AssignmentExpression
...
如果以下条件都为真,则抛出 SyntaxError 异常:
...
IsStrictReference(lref) 为真

左侧表达式

和解释 IsStrictReference的参考规范类型:

...函数调用被允许返回引用。这种可能性纯粹是为了宿主对象而被承认的。本规范定义的内置 ECMAScript 函数没有返回引用,也没有规定用户定义的函数返回引用......

于 2017-04-14T15:04:02.627 回答
0

我的eslint模块也是如此。EsLinterParsing error: Invalid left-hand side in assignment expression在第二个 if 语句中抛出等待。

if (condition_one) {
  let result = await myFunction()
}

if (condition_two) {
  let result = await myFunction() // eslint parsing error
}

听起来很奇怪,解决此错误的方法是添加发生等待的行尾的分号。

if (condition_one) {
  let result = await myFunction();
}

if (condition_two) {
  let result = await myFunction();
}
于 2020-03-05T13:35:33.480 回答