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 相关文章推荐
JavaScript 获取事件对象的注意点
Jul 29 Javascript
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
May 25 Javascript
基于jquery的高性能td和input切换并可修改内容实现代码
Jan 09 Javascript
js精准的倒计时函数分享
Jun 29 Javascript
教大家轻松制作Bootstrap漂亮表格(table)
Dec 13 Javascript
jquery表单验证插件validation使用方法详解
Jan 20 Javascript
vue中实现methods一个方法调用另外一个方法
Feb 08 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
Aug 28 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
vue-devtools的安装和使用步骤详解
Oct 17 Javascript
vue 在单页面应用里使用二级套嵌路由
Dec 19 Vue.js
详解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在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
jquery autocomplete自动完成插件的的使用方法
2010/08/07 Javascript
nodejs简单实现中英文翻译
2015/05/04 NodeJs
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
jQuery实现布局高宽自适应的简单实例
2016/05/28 Javascript
JSON 数据详解及实例代码分析
2017/01/20 Javascript
Vue仿微信app页面跳转动画效果
2019/08/21 Javascript
非常漂亮的js烟花效果
2020/03/10 Javascript
vue在App.vue文件中监听路由变化刷新页面操作
2020/08/14 Javascript
[01:28:44]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第一场 1月10日
2021/03/11 DOTA
python实现一次创建多级目录的方法
2015/05/15 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
vscode 远程调试python的方法
2017/12/01 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
对python中类的继承与方法重写介绍
2019/01/20 Python
对python pandas读取剪贴板内容的方法详解
2019/01/24 Python
python小程序实现刷票功能详解
2019/07/17 Python
python实现对图片进行旋转,放缩,裁剪的功能
2019/08/07 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Notino罗马尼亚网站:购买香水和化妆品
2019/07/20 全球购物
试解释COMMIT操作和ROLLBACK操作的语义
2014/07/25 面试题
如何撰写一封出色的求职信
2014/04/27 职场文书
竞聘上岗演讲稿
2014/05/16 职场文书
销售提升方案
2014/06/07 职场文书
新闻报道策划方案
2014/06/11 职场文书
班子成员四风问题自我剖析材料
2014/09/29 职场文书
关于感恩的作文
2019/08/26 职场文书
python编程实现清理微信重复缓存文件
2021/11/01 Python
MySQL之MyISAM存储引擎的非聚簇索引详解
2022/03/03 MySQL