JavaScript中splice与slice的区别


Posted in Javascript onMay 09, 2017

splice与slice是数组中的两个常用方法,但是很多初学者很容易将二者混淆。

slice的操作不影响原数组。会返回所选择的元素。

splice往数组中指定位置添加或删除元素,会影响原数组。返回被删除的元素。

slice()

可从已有的数组中返回选定的元素。

语法

arrayObject.slice(start,end)

start 必需。规定从何处开始选取。如果是负数,那么它规定从数组尾部开始算起的位置。也就是说,-1 指最后一个元素,-2 指倒数第二个元素,以此类推。

end 可选。规定从何处结束选取。该参数是数组片断结束处的数组下标。如果没有指定该参数,那么切分的数组包含从 start 到数组结束的所有元素。如果这个参数是负数,那么它规定的是从数组尾部开始算起的元素。

var arr = [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

var arr = [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) 可以快速复制并生成 一个新的数组,不过数组是新的,里面的元素还是原来的引用,比如:

var o = [1, 2]
var arr = [ 3, 4, o ]
var clone = arr.slice(0)
console.log(clone)
> [3, 4, Array[2]]

用concat复制数组

Array.concat 数组拼接函数也可以用来复制数组,比如:

var o = [1, 2]
var arr = [ 3, 4, o ]
var clone = arr.concat()
console.log(clone)
> [3, 4, Array[2]]

不过 slice和concat 生成的数组是新的,但里面的元素还是原来的引用,比如:

clone[2].push(3)
console.log(o)
> [1, 2, 3]

用JSON parse/ strinigfy 进行深度复制

可以使用 JSON.parse(JSON.stringify(arr)) 对对象或数组进行快速深度复制,此种方法无法复制 function 等无法序列化的对象,比如:

var o = [1, 2]
var arr = [ 3, 4, o ]
var clone = JSON.parse(JSON.stringify(arr))
console.log(clone)

> [3, 4, Array[2]]


clone[2].push(3)
console.log(o)
> [1, 2] //o元素没有变化

参考:

https://3water.com/w3school/jsref/jsref_splice.htm

Javascript 相关文章推荐
基础的prototype.js常用函数及其用法
Mar 10 Javascript
地震发生中逃生十大法则
May 12 Javascript
jquery 合并内容相同的单元格(示例代码)
Dec 13 Javascript
jQuery标签替换函数replaceWith()的使用例子
Aug 28 Javascript
JavaScript入门基础
Aug 12 Javascript
在JavaScript中call()与apply()区别
Jan 22 Javascript
微信小程序 实例开发总结
Apr 26 Javascript
基于vue监听滚动事件实现锚点链接平滑滚动的方法
Jan 17 Javascript
Vue中"This dependency was not found"问题的解决方法
Jun 19 Javascript
VUE项目初建和常见问题总结
Sep 12 Javascript
查找Vue中下标的操作(some和findindex)
Aug 12 Javascript
详解ES6中class的实现原理
Oct 03 Javascript
详解node中创建服务进程
May 09 #Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 #Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 #jQuery
微信小程序 标签传入数据
May 08 #Javascript
Webpack实现按需打包Lodash的几种方法详解
May 08 #Javascript
JS正则表达式验证中文字符
May 08 #Javascript
bootstrap table表格插件使用详解
May 08 #Javascript
You might like
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
php使用exec shell命令注入的方法讲解
2013/11/12 PHP
php使用pdo连接sqlite3的配置示例
2016/05/27 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
jQuery插件开发基础简单介绍
2013/01/07 Javascript
网页右键ie不支持event.preventDefault和event.returnValue (需要加window)
2013/02/22 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
ECMAScript5(ES5)中bind方法使用小结
2015/05/07 Javascript
js实现的tab标签切换效果代码分享
2015/08/25 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
微信小程序开发之实现自定义Toast弹框
2017/06/08 Javascript
React组件之间的通信的实例代码
2017/06/27 Javascript
Vue.js实现列表清单的操作方法
2017/11/15 Javascript
关于HTML5的data-*自定义属性的总结
2018/05/05 Javascript
小程序多图列表实现性能优化的方法步骤
2019/05/28 Javascript
JS 数组基本用法入门示例解析
2020/01/16 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
python的迭代器与生成器实例详解
2014/07/16 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
python后端接收前端回传的文件方法
2019/01/02 Python
python实现socket+threading处理多连接的方法
2019/07/23 Python
css3实现超立体3D图片侧翻倾斜效果
2014/04/16 HTML / CSS
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
新加坡网上化妆品店:Best Buy World
2018/05/18 全球购物
固特异美国在线轮胎店:Goodyear Tire
2019/02/23 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
英智兴达软件测试笔试题
2016/10/12 面试题
介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)
2014/10/31 面试题
小学教师2014年度工作总结
2014/12/03 职场文书
历史博物馆观后感
2015/06/05 职场文书
安全学习心得体会范文
2016/01/18 职场文书
Python实现生活常识解答机器人
2021/06/28 Python
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Python实现聚类K-means算法详解
2022/07/15 Python