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 相关文章推荐
网站页面自动跳转实现方法PHP、JSP(下)
Aug 01 Javascript
JavaScript自定义日期格式化函数详细解析
Jan 14 Javascript
JavaScript分析、压缩工具JavaScript Analyser
Dec 31 Javascript
详解JS正则replace的使用方法
Mar 06 Javascript
微信小程序 Storage API实例详解
Oct 02 Javascript
微信小程序 获取设备信息 API实例详解
Oct 02 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
Nov 09 Javascript
Angularjs的$http异步删除数据详解及实例
Jul 27 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
vue-cli和v-charts实现可视化图表过程解析
Oct 08 Javascript
vue 二维码长按保存和复制内容操作
Sep 22 Javascript
vue实现倒计时功能
Mar 24 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” 彩蛋进行敏感信息获取
2013/08/07 PHP
修改apache配置文件去除thinkphp url中的index.php
2014/01/17 PHP
js 方法实现返回多个数据的代码
2009/04/30 Javascript
Javascript Global对象
2009/08/13 Javascript
Jquery 表单取值赋值的一些基本操作
2009/10/11 Javascript
jQuery下通过$.browser来判断浏览器.
2011/04/05 Javascript
框架页面高度自动刷新的Javascript脚本
2013/11/01 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
jQuery遍历json的方法(推荐)
2016/06/12 Javascript
特殊日期提示功能的实现方法
2016/06/16 Javascript
vue2.X组件学习心得(新手必看篇)
2017/07/05 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
2017/11/21 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
vue自定义树状结构图的实现方法
2020/10/18 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
2020/11/12 Javascript
[02:40]DOTA2英雄基础教程 先知
2013/11/29 DOTA
Python SQL查询并生成json文件操作示例
2018/08/17 Python
使用selenium和pyquery爬取京东商品列表过程解析
2019/08/15 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
Python-split()函数实例用法讲解
2020/12/18 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
使用phonegap检测网络状态的方法
2017/03/30 HTML / CSS
如何使用canvas绘制可移动网格的示例代码
2020/12/14 HTML / CSS
Lookfantastic西班牙官网:英国知名美妆购物网站
2018/06/13 全球购物
潘多拉珠宝俄罗斯官方网上商店:PANDORA俄罗斯
2020/09/22 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
光盘行动倡议书
2014/02/02 职场文书
2014老师三严三实对照检查材料思想汇报
2014/09/18 职场文书
小学一年级数学教学计划
2015/01/20 职场文书
西游记读书笔记
2015/06/25 职场文书
幼儿园小班教师随笔
2015/08/14 职场文书
Springboot配置suffix指定mvc视图的后缀方法
2021/07/03 Java/Android
MySQL中的引号和反引号的区别与用法详解
2021/10/24 MySQL
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android