Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 数组赋值中的引用错误(左侧赋值)_Javascript_Arrays_Variable Assignment_Operator Keyword_Ternary - Fatal编程技术网

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)的函数之外 我知道我在这里做错了什么,丢失了一个标志/一对括号或其他东西。我已

我有下面的代码,我试图在参数的帮助下执行一个函数。该参数告诉Javascript对其指示的数组/字符串执行操作(例如,如果
id
参数为0,则
ps
array和
properties
string;如果
id
非0,则
as
数组和
属性
字符串):

,在这里。它在
(id==0?ps:as)=
部分抛出“未捕获引用错误:赋值中的左侧无效”。如果我从
=
的左侧移除括号,它会工作,除了它只执行后一个数组(aka
as
)而不执行前一个数组(aka
ps
)的函数之外

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


那么…这个有什么问题吗?

您不能在赋值的左侧使用
?:
。三元运算符表达式的值始终是一个值,而不是一个引用;编程语言的人们通常使用术语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}在我的功能结束时。如果您提供了一个适用于我的特定代码的简单解决方案,您的答案将是完美的,但即使如此,这也是最好的答案。谢谢。我不得不删除并重新发布我更正的评论,因为我无法编辑它。