Javascript can';t理解与接头调用相关联的尾部元素索引

Javascript can';t理解与接头调用相关联的尾部元素索引,javascript,Javascript,我发现了一个将数组中的元素移动到不同位置的强大功能: function eleMove1( arr, from, to ) { arr.splice( to, 0, arr.splice( from, 1 )[ 0 ] ); } var arr = [ 'a', 'b', 'c', 'd', 'e' ]; eleMove1( arr, 3, 0 ); console.log ( 'eleMove1: ' + arr ); // eleMove1: d,a,b,c,e console.log

我发现了一个将数组中的元素移动到不同位置的强大功能:

function eleMove1( arr, from, to ) {
  arr.splice( to, 0, arr.splice( from, 1 )[ 0 ] );
}

var arr = [ 'a', 'b', 'c', 'd', 'e' ];
eleMove1( arr, 3, 0 );
console.log ( 'eleMove1: ' + arr ); // eleMove1: d,a,b,c,e
console.log ( arr ); // ["d", "a", "b", "c", "e"]
console.log ( '\n ' );

/*
*/

function eleMove2( arr, from, to ) {
  arr.splice( to, 0, arr.splice( from, 1 ) );
}

var arr = [ 'a', 'b', 'c', 'd', 'e' ];
eleMove2( arr, 3, 0 );
console.log ( 'eleMove2: ' + arr ); // eleMove2: d,a,b,c,e
console.log ( arr ); // [["d"], "a", "b", "c", "e"]
console.log ( '\n ' );
但由于我刚刚开始学习JS,我对
[0]的相关性感到困惑拼接语句的一部分。惯例使我相信它指的是数组的第一个索引元素。但是什么数组?当然不是传递给函数的arr,也不是func的arg数组,因为我从中提取的原始函数实际上没有将arr作为func的arg之一传递:

在arr上的第二次拼接调用结束时,它似乎挂断了,但我仍然不知道为什么以及为什么


然而,arr的输出似乎没有受到缺少这段代码的影响。那么,splice语句中这个小片段的意义是什么?如果有的话,它是如何与函数的整体性能相关联的?

[0]
引用数组中被删除的第一个元素。如果我们仔细检查代码

function eleMove1( arr, from, to ) {
  arr.splice( to, 0, arr.splice( from, 1 )[ 0 ] );
}
类似于这样的写作

function eleMove1( arr, from, to ) {
  deletedItemsArray = arr.splice( from, 1 );
  itemYouDeleted = deletedItemsArray[0];

  arr.splice( to, 0, itemYouDeleted);
}

这是因为splice在适当的位置突变了arr,并将其删除的项作为数组返回。该已删除项成为初始arr.splice方法的参数,该方法将
itemYouDeleted
置于
位置,以

您的输出确实显示了此代码所产生的差异

orig:    console.log ( arr ); // ["d", "a", "b", "c", "e"]
changed: console.log ( arr ); // [["d"], "a", "b", "c", "e"]
                                  ^^^^^

这个小
[0]
splice
返回的数组中抓取第一个元素,并在插入时使用它而不是整个数组。

splice
返回一个数组!因此,您必须指定要从该数组中选择哪个元素,即使剪切元素是一项。这是文件!我很欣赏这个链接,因为splice的w3页面似乎没有明确提到存储提取的值并重新推送到新位置的拼接数组。是的,MDN更详细:
返回值:包含已删除元素的数组。如果只删除一个元素,则返回一个元素**的**数组**。如果没有删除任何元素,则返回一个空数组。
和W3详细信息:
定义和用法:splice()方法在数组中添加/删除项,并且**返回**删除的项)**。
MDN比W3好得多,因为它提供了很多详细信息!好吧,我听到远处有钟声在响,但我想我得多想想,让它们响得更响。因此,从arr.splice(from,1)提取的值被放入tmp拼接数组中,因此可以删除元素位置3(from=3)(按照1参数的指示),然后引用并移动到数组的第一个元素位置。好的,是的,这是有道理的,但仍然有一点过时的看和理解。是的,最容易把它看作是两个独立的函数调用。它依赖于实际更改引用数组和作为删除项的拼接的返回值。虽然这不是第一个答案,但我接受了它,因为它提供了我需要的详细程度来消除我的困惑(缺少)对这个概念的理解。是的,实际上是这个双方括号一开始引起了我的注意,让我挖掘得更多,因为我不明白它背后的原因。现在它更有意义了。