Javascript 数组赋值中的引用错误(左侧赋值)
我有下面的代码,我试图在参数的帮助下执行一个函数。该参数告诉Javascript对其指示的数组/字符串执行操作(例如,如果Javascript 数组赋值中的引用错误(左侧赋值),javascript,arrays,variable-assignment,operator-keyword,ternary,Javascript,Arrays,Variable Assignment,Operator Keyword,Ternary,我有下面的代码,我试图在参数的帮助下执行一个函数。该参数告诉Javascript对其指示的数组/字符串执行操作(例如,如果id参数为0,则psarray和propertiesstring;如果id非0,则as数组和属性字符串): ,在这里。它在(id==0?ps:as)=部分抛出“未捕获引用错误:赋值中的左侧无效”。如果我从=的左侧移除括号,它会工作,除了它只执行后一个数组(akaas)而不执行前一个数组(akaps)的函数之外 我知道我在这里做错了什么,丢失了一个标志/一对括号或其他东西。我已
id
参数为0,则ps
array和properties
string;如果id
非0,则as
数组和属性
字符串):
,在这里。它在(id==0?ps:as)=
部分抛出“未捕获引用错误:赋值中的左侧无效”。如果我从=
的左侧移除括号,它会工作,除了它只执行后一个数组(akaas
)而不执行前一个数组(akaps
)的函数之外
我知道我在这里做错了什么,丢失了一个标志/一对括号或其他东西。我已经检查了,关于同一问题的其他问题,但所有问题都表明它应该有效,因为操作符(我认为)是正确的,例如,条件的==
,赋值的简单=
,等等。最困扰我的是三元操作符中的其他引用有效(此示例的右侧部分,我代码的其他部分)
那么…这个有什么问题吗?您不能在赋值的左侧使用
?:
。三元运算符表达式的值始终是一个值,而不是一个引用;编程语言的人们通常使用术语r值和l值。您只能赋值给l值,但不能用生成l值?:
“l”和“r”代表“左”和“右”,与赋值运算符有关。当然,并非所有语言都从右向左赋值;音乐编程语言“Chuck”就是一个反例
如果要为对象属性指定值,可以执行以下操作:
someObject[foo == bar ? "x" : "y"] = whatever();
if (0 === id) ps = something;
else as = something;
这是因为?:
是一个子表达式,它是赋值左侧确定的一部分。这没关系,因为外部[]
表达式返回一个l值。表达式(id==0?ps:as)
将ps
或的值作为
返回。如果要将某项
赋值给变量,请执行以下操作:
someObject[foo == bar ? "x" : "y"] = whatever();
if (0 === id) ps = something;
else as = something;
另一种方法是将对象包装在ps
和as
周围,并通过计算成员访问有条件地设置任一成员:
const obj = {
ps: [],
as: [],
}
obj[0 === id ? 'ps' : 'as'] = something;
您可以使用数组执行一个操作,并使用右赋值结果
函数getpsas(id){
[ps,as]=Object.assign([ps,as]{
[id]:[properties,attributes][id]
.拆分(“”)
.map(函数(元素){var eqlpos=element.lastIndexOf(“=”);返回{name:element.substr(0,eqlpos),类型:element.substr(eqlpos+1)};})
.过滤器(滤芯=>/^(蔬菜|水果)$/.测试(滤芯.类型))
});
}
var properties=“苹果=水果”,
attributes=“胡萝卜=蔬菜香蕉=水果樱桃=水果”,
ps=[],
as=[];
getpsas(0);
getpsas(1);
控制台日志(ps);
console.log(as);
.as控制台包装器{max height:100%!important;top:0;}
答案不错,面向解决方案,但它没有解释为什么会发生这种情况(Pointy的答案并不缺少)。我必须标记他的答案,因为我实际上理解我错在哪里。不过,我还是给了你一票-谢谢你。谢谢你提供了一个完全适合我的代码的解决方案。就像杰弗里的答案一样,这无疑是有帮助的,但并没有解释我错在哪里。但是,我给了你一票。这只是一个答案,有什么可能。你的答案问题由描述得很好,无需重复。确实如此。您可以查看我对Pointy的注释,看看我如何在不使用其他对象(临时数组除外)的情况下解决它我必须承认,这是最好的答案,因为它准确地解释了发生的情况以及我的方法不正确的原因。我解决了这个问题,没有使用“对象”(严格地说),而是将等式的右侧部分指定给一个“伪数组”(名为temp),然后使if(id==0){ps=temp;}else{as=temp}在我的功能结束时。如果您提供了一个适用于我的特定代码的简单解决方案,您的答案将是完美的,但即使如此,这也是最好的答案。谢谢。我不得不删除并重新发布我更正的评论,因为我无法编辑它。