数组赋值中的引用错误(左侧对齐)

时间:2017-08-24 20:13:34

标签: javascript arrays variable-assignment operator-keyword ternary

我有以下代码,我试图在参数的帮助下执行函数。该参数告诉Javascript对它指示的数组/字符串执行操作(例如ps数组和properties字符串id参数为0,as数组和如果attributes不是0,则为id字符串:

var properties = "apple=fruit";
var attributes = "carrot=vegetable banana=fruit cherry=fruit fruit";
var ps = [];
var as = [];

function getpsas(id)
  {
  (id === 0 ? ps : as) = (id === 0 ? properties : attributes).split(" ").map
    (
    function(element)
      {
      var eqlpos = element.lastIndexOf("=");
      return {name: element.substr(0, eqlpos), type: element.substr(eqlpos + 1)};
      }
    ).filter
      (
      function(element)
        {
        return (/^(vegetable|fruit)$/.test(element.type));
        }
      );
  }

getpsas(0);
getpsas(1);

console.log(ps);
console.log(as);

Fiddle在这里。它抛出一个" Uncaught ReferenceError:赋值中的左侧无效"在(id === 0 ? ps : as) =部分。如果我删除=左侧的括号,它可以工作,除了它执行仅后一个数组(又名as)的函数,而不是前者(又名ps })。

我知道我在这里做错了什么,错过了一个标志/一对括号或其他东西。我已经检查了operator precedence in Javascript,关于同一问题的其他问题,但是所有问题都表明它应该有效,因为运算符(我认为)是正确的,例如===用于条件,简单=用于赋值等。最令我困扰的是三元运算符内的其他引用有效(此示例的右侧部分,我的代码的其他部分)。

那么......这个有什么问题?

3 个答案:

答案 0 :(得分:3)

您不能在作业的左侧使用? :。三元运算符表达式的值始终是,而不是引用;编程语言人们通常使用术语 r-value l-value 。您只能分配给 l-value ,但不能使用? :生成 l-value

“l”和“r”代表“左”和“右”,并且相对于赋值运算符。当然,并非所有语言都是从右到左进行分配;音乐编程语言“Chuck”是一个反例。

如果要为对象属性赋值,则可以执行以下操作:

someObject[foo == bar ? "x" : "y"] = whatever();

那是因为? :是一个子表达式,它是确定赋值左侧的一部分。这没关系,因为外[ ]表达式返回 l-value

答案 1 :(得分:2)

表达式(id === 0 ? ps : as)返回psas的值。如果要将something分配给变量,请执行以下操作:

if (0 === id) ps = something;
else as = something;

另一种方法是在psas周围包装一个对象,并通过计算成员访问有条件地设置任一成员:

const obj = {
    ps: [],
    as: [],
}

obj[0 === id ? 'ps' : 'as'] = something;

答案 2 :(得分:1)

您可以使用数组destructuring assignmentcomputed property names分配正确的结果。



.as-console-wrapper { max-height: 100% !important; top: 0; }

Rectangle bounds = new Rectangle(x1, y1, x2, y2); //corners of the image/texture
Vector3D touchPoint;
touchPoint.set(Gdx.input.getX(), Gdx.input.getY(), 0);
if (bounds.contains(touchPoint.x, touchPoint.y)) {
    gsm.set(new PlayState(gsm));
}