鉴于本人总是把slice和splice弄混,此处写一遍加深记忆。
首先注意两者的共同点:
- 针对数组
不同点在于:
- 功能完全不同;
- 返回值的用法不同;
- 是否改变原数组
slice
slice
的作用是从已有数组中返回选定的元素。
参数说明:arrayObject.slice(start, end)
start —— 必需,规定从何处开始选取。如果是负数,则规定的是从数组尾部开始算起的位置(-1指最后一个元素,-2指倒数第二个元素)。
end —— 可选,规定从何处结束选取(不包括该元素)。如果没有指定,则选取到数组结束的所有元素。如果是负数,那么他规定的是从数组尾部开始算起的元素。
补充说明:负数只表示选取位置,并不能旋转数组。(end取负数的倒数第几元素,依旧不选取,结果包含它左边的元素)
控制台测试:
var a = [1,2,3,4,5,6,7,8,9]
a.slice(3)
<< [4, 5, 6, 7, 8, 9]
a.slice(3,-2)
<< [4, 5, 6, 7]
a.slice(-3,-2)
<< [7]
a.slice(-6,-2)
<< [4, 5, 6, 7]
var b = a.slice(1,5) // 返回值是被截取的数组,原数组始终未改变
b
<< [2, 3, 4, 5]
splice
splice
的作用是对数组添加或删除元素,并返回被删除的元素。
参数说明:arrayObject.splice(index, howmany, item1, … , itemX)
index —— 必需,添加/删除的位置,如果是负数则从数组结尾处规定。
howmany —— 必需,要删除的元素数量,如果设置为0, 则不会删除元素。
item1, … , itemX —— 可选,向数组添加的新元素。
控制台测试:
var a = [1,2,3,4,5,6,7,8,9]
var b = a.splice(3,0)
b
<< []
var b = a.splice(3,1)
b
<< [4]
a
<< [1, 2, 3, 5, 6, 7, 8, 9]
var b = a.splice(3,-1) // 第二个参数表示数量,负数无效果
b
<< []
a
<< [1, 2, 3, 5, 6, 7, 8, 9]
var b = a.splice(-3,1)
b
<< [7]
a
<< [1, 2, 3, 5, 6, 8, 9]
var b = a.splice(3,2,'a','b')
b
<< [5, 6]
a
<< [1, 2, 3, "a", "b", 8, 9]
两者对比:
var xs = [1,2,3,4,5];
// 纯的
xs.slice(0,3);
//=> [1,2,3]
xs.slice(0,3);
//=> [1,2,3]
xs.slice(0,3);
//=> [1,2,3]
// 不纯的
xs.splice(0,3);
//=> [1,2,3]
xs.splice(0,3);
//=> [4,5]
xs.splice(0,3);
//=> []
对比示例原文:https://blog.csdn.net/u013007900/article/details/79104110