我有以下代码,我试图在参数的帮助下执行函数。该参数告诉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,关于同一问题的其他问题,但是所有问题都表明它应该有效,因为运算符(我认为)是正确的,例如===
用于条件,简单=
用于赋值等。最令我困扰的是三元运算符内的其他引用有效(此示例的右侧部分,我的代码的其他部分)。
那么......这个有什么问题?
答案 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)
返回ps
或as
的值。如果要将something
分配给变量,请执行以下操作:
if (0 === id) ps = something;
else as = something;
另一种方法是在ps
和as
周围包装一个对象,并通过计算成员访问有条件地设置任一成员:
const obj = {
ps: [],
as: [],
}
obj[0 === id ? 'ps' : 'as'] = something;
答案 2 :(得分:1)
您可以使用数组destructuring assignment和computed 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));
}