JavaScript中splice与slice的区别
splice与slice是数组中的两个常用方法,但是很多初学者很容易将二者混淆。
slice的操作不影响原数组。会返回所选择的元素。
splice往数组中指定位置添加或删除元素,会影响原数组。返回被删除的元素。
slice()
可从已有的数组中返回选定的元素。
语法
arrayObject.slice(start,end)
start必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1指最后一个元素,-2指倒数第二个元素,以此类推。
end可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从start到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。
vararr=[1,2,3,4,5,6] arr.slice(2,3)//返回[3]
splice()
splice()方法向/从数组中添加/删除项目,然后返回被删除的项目。
注释:该方法会改变原始数组。
arrayObject.splice(index,howmany,item1,.....,itemX)
index必需。整数,规定添加/删除项目的位置,使用负数可从数组结尾处规定位置。
howmany必需。要删除的项目数量。如果设置为0,则不会删除项目。
item1,...,itemX可选。向数组添加的新项目。
如,向数组的起始位置插入一个新的元素 -1
vararr=[1,2,3,4,5,6] arr.splice(0,0,-1)//返回[],第二个参数为0,即不删除任何元素 console.log(arr) >[-1,1,2,3,4,5,6]
用slice复制数组
使用slice(0)可以快速复制并生成一个新的数组,不过数组是新的,里面的元素还是原来的引用,比如:
varo=[1,2] vararr=[3,4,o] varclone=arr.slice(0) console.log(clone) >[3,4,Array[2]]
用concat复制数组
Array.concat数组拼接函数也可以用来复制数组,比如:
varo=[1,2] vararr=[3,4,o] varclone=arr.concat() console.log(clone) >[3,4,Array[2]]
不过slice和concat生成的数组是新的,但里面的元素还是原来的引用,比如:
clone[2].push(3) console.log(o) >[1,2,3]
用JSONparse/strinigfy进行深度复制
可以使用JSON.parse(JSON.stringify(arr))对对象或数组进行快速深度复制,此种方法无法复制function等无法序列化的对象,比如:
varo=[1,2] vararr=[3,4,o] varclone=JSON.parse(JSON.stringify(arr)) console.log(clone) >[3,4,Array[2]] clone[2].push(3) console.log(o) >[1,2]//o元素没有变化
参考:
https://www.nhooo.com/w3school/jsref/jsref_slice_array.htm
https://www.nhooo.com/w3school/jsref/jsref_splice.htm