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 相关文章推荐
支持ie与FireFox的剪切板操作代码
Sep 28 Javascript
JS简单实现多级Select联动菜单效果代码
Sep 06 Javascript
jQuery UI仿淘宝搜索下拉列表功能
Jan 10 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
Javascript创建类和对象详解
May 31 Javascript
jQuery实现用户信息表格的添加和删除功能
Sep 12 jQuery
Angular实现下拉框模糊查询功能示例
Jan 03 Javascript
Angular4 ElementRef的应用
Feb 26 Javascript
Vue实现的父组件向子组件传值功能示例
Jan 19 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
Feb 15 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
Aug 07 Javascript
Python版实现微信公众号扫码登陆
May 28 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安装问题
2006/10/09 PHP
PHP 数组遍历顺序理解
2009/09/09 PHP
比较全面的PHP数组的使用方法小结
2010/09/23 PHP
php 文件上传类代码
2011/08/06 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
浅谈JavaScript函数节流
2014/12/09 Javascript
浅谈EasyUI中Treegrid节点的删除
2015/03/01 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
2016/11/23 Javascript
javaScript语法总结
2016/11/25 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
基于axios 的responseType类型的设置方法
2019/10/29 Javascript
vue input标签通用指令校验的实现
2019/11/05 Javascript
JavaScript 闭包的使用场景
2020/09/17 Javascript
Python中的map、reduce和filter浅析
2014/04/26 Python
Python实现拷贝/删除文件夹的方法详解
2018/08/29 Python
python lxml中etree的简单应用
2019/05/10 Python
python求最大值最小值方法总结
2019/06/25 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
2019/06/27 Python
将Python文件打包成.EXE可执行文件的方法
2019/08/11 Python
python GUI库图形界面开发之PyQt5窗口背景与不规则窗口实例
2020/02/25 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
结束运行python的方法
2020/06/16 Python
pycharm 2020.2.4 pip install Flask 报错 Error:Non-zero exit code的问题
2020/12/04 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
英国版MAC彩妆品牌:Illamasqua
2018/04/18 全球购物
Ajax主要包含了哪些技术
2014/06/12 面试题
手机业务员岗位职责
2013/12/13 职场文书
个人综合鉴定材料
2014/05/23 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
大学辅导员述职报告
2015/01/10 职场文书
检讨书格式
2015/05/07 职场文书
经营目标责任书
2015/05/08 职场文书
高中数学教学反思范文
2016/02/18 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang