Javascript 如何使用Array.push并返回推送的项目?

Javascript 如何使用Array.push并返回推送的项目?,javascript,arrays,Javascript,Arrays,我正在调用returnsomearr[someArr.push(newItem)-1]并且它做了它应该做的事情 想知道这个极其常见的操作是否有语法上的“糖”?我想知道,因为返回的新长度确实比实际构造的对象(调用者可能明确地想要处理)更不需要。或者这是因为它实际上会返回“一个对象的副本”,而我对它的字段所做的编辑在实际的树中“将不存在” 就像JS一样,您可以使用: 逗号运算符计算每个操作数(从左到右)并返回最后一个操作数的值 像这样: return (someArr.push(newItem),

我正在调用
returnsomearr[someArr.push(newItem)-1]并且它做了它应该做的事情

想知道这个极其常见的操作是否有语法上的“糖”?我想知道,因为返回的新
长度
确实比实际构造的对象(调用者可能明确地想要处理)更不需要。或者这是因为它实际上会返回“一个对象的副本”,而我对它的字段所做的编辑在实际的树中“将不存在”

就像JS一样,您可以使用:

逗号运算符计算每个操作数(从左到右)并返回最后一个操作数的值

像这样:

return (someArr.push(newItem), newItem)
这相当于:

someArr.push(newItem);
return newItem

你也可以用一个简单的方法

由于推送后数组长度为正,因此将计算最右边的表达式并返回其值

不过,这种语法不如@adiga使用逗号运算符的答案清晰

但是,我个人更喜欢在新行返回新项目,以使其更具可读性:

someArr.push(newItem);
return newItem;

您可以通过将赋值返回到当前
.length
的索引来完成此操作

return someArr[someArr.length] = newItem;
分配的结果是被分配的项,因此将返回该项


分配给数组的当前
.length
,将自动展开该数组。请注意,分配给任何高于当前
.length
的索引都会在数组中留下漏洞。

我来自C/C++。
newItem
是指针/引用吗?或者它本身是一个对象(值)(将被复制)?JavaScript是很难获得的,比普通的汇编程序/Basic/C/Pascal,甚至抽象C++更难……如果它是一个对象,它将保留引用。基本上,你的代码和这个没有区别。让我们假设
a=x[i]
,让
a
成为
i
-数组
x
的第四个元素。我在问:是
返回a
=“创建新对象
a
,从
x[I]
复制字段。对
a
字段的任何后续修改都不会影响到`x[I]
。还是返回指针/Reference=“返回指向x[I]实际内存位置的指针”。对字段的任何编辑
a`都将编辑实际的父对象字段
x[i]
?“它在JS中不明显!区别在于:
someArr.push(newItem);return newItem;
。然后在我们得到return之后:
newItem.field=123;alert(someArr[someArr.length-1].field);
a副本(C/C++)将产生<代码> null 或<代码>未定义(在父类中没有字段,因为只是对象拷贝被修改了——实际上C++中返回的是对象拷贝)。引用或指针将指向123。你现在明白我的问题了吗?@xakepp35停止比较语言。这是一个引用。这就是我所说的:第一个语法使用
&
比使用逗号运算符可读性差得多。使用
&
的含义是如果
推送()
返回一个错误的值,然后不返回
newItem
。任何一个理智的开发人员在实现
push()之前都会仔细考虑这个问题
总是返回一个真实的值,然后让实现这个讨厌的快捷方式的开发人员感到羞耻,然后用两个简单得多的语句将其更改为第二个块。我同意这会降低可读性,甚至不太酷。我认为你的最后一种方法肯定是更好的方法。我完全同意你的观点,这就是我为什么要onned我会在另一行返回该项目。我会提到@adiga的答案,因为我发现它更清晰。但我个人永远不会在同一行返回该项目。我认为
&
是用于惰性评估的,当你需要评估第二个时,如果第一个不
null
未定义
code>或以某种方式“空”,如空字符串。这里的区别:
f=()=>{return”“&&1;}
将输出
,而
f=()=>{return”“,1;}
将输出1,如果
push()
失败,这是不需要的。我将坚持你的东西,因为如果
push()
失败我必须忽略新创建的对象并检测它(返回零而不是有效对象)。使用逗号运算符,我不会在代码中检测到插入失败。另一个伟大的候选者,可能是一个可行的东西!。如何选择一个获胜者?我们应该对结果进行基准测试并比较结果吗?V8的哪个版本应该“v选择?”)))))))@xakepp35过早优化是万恶之源。甚至不用麻烦进行基准测试。如果在某个时候你有一个性能问题,我敢肯定在性能快照出现问题之前,还有很多事情会对性能产生更显著的影响。@PatrickRoberts:虽然这肯定是一个不值得费心的微优化,但它不属于Knuth所描述的过早优化领域。在这种情况下,需要为代码增加太多的复杂性/混乱,而优化太少。在这里,优化(如果有的话)很小,但增加的复杂性(如果有的话)也很小。事实上,这个答案需要一个解释来验证它是否会导致同样的副作用(由于数组外来对象在将值分配给索引大于或等于其
长度的插槽时如何修改其
长度
属性),我很确定它会属于这个领域,如果它是一个优化的话。@PatrickRoberts:我倾向于不同意。所有语法功能都需要向初学者解释;Knuth是向有经验的软件工程师演讲的。Knuth关心的是难以理解和长期维护的重大结构变化虽然只提供最小的好处。也就是说,我避免使用赋值的结果,除非在极少数情况下。如果OP想要这种行为,他们应该创建一个util
return someArr[someArr.length] = newItem;