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 相关文章推荐
如何在Web页面上直接打开、编辑、创建Office文档
Mar 12 Javascript
理解JSON:3分钟课程
Oct 28 Javascript
js实现页面跳转重定向的几种方式
May 29 Javascript
jquery常用方法及使用示例汇总
Nov 08 Javascript
jquery带动画效果幻灯片特效代码
Aug 27 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
iScroll.js 使用方法参考
May 16 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
Sep 22 Javascript
JS函数节流和函数防抖问题分析
Dec 18 Javascript
解决使用Vue.js显示数据的时,页面闪现原始代码的问题
Feb 11 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
May 31 Javascript
Nuxt.js 静态资源和打包的操作
Nov 06 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数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
js下弹出窗口的变通
2007/04/18 Javascript
让iframe自适应高度(支持XHTML,支持FF)
2007/07/24 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
js实现iframe自动自适应高度的方法
2015/02/17 Javascript
微信小程序 action-sheet底部菜单详解
2016/10/27 Javascript
nodejs服务搭建教程 nodejs访问本地站点文件
2017/04/07 NodeJs
利用node.js实现反向代理的方法详解
2017/07/24 Javascript
详解滑动穿透(锁body)终极探索
2019/04/16 Javascript
python使用xmlrpc实例讲解
2013/12/17 Python
Python中操作MySQL入门实例
2015/02/08 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
2016/02/19 Python
python机器学习之决策树分类详解
2017/12/20 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
python实现比较文件内容异同
2018/06/22 Python
Python3数据库操作包pymysql的操作方法
2018/07/16 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
树莓派采用socket方式文件传输(python)
2019/06/22 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
python 实现生成均匀分布的点
2019/12/05 Python
在pycharm中实现删除bookmark
2020/02/14 Python
基于K.image_data_format() == 'channels_first' 的理解
2020/06/29 Python
Python数据库封装实现代码示例解析
2020/09/05 Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
2021/01/28 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
UNIX文件系统常用命令
2012/05/25 面试题
教师实习自我鉴定
2013/12/11 职场文书
文秘人员工作职责
2014/01/31 职场文书
2014年母亲节演讲稿范文
2014/05/07 职场文书
股票投资建议书
2014/05/19 职场文书
文案策划专业自荐信
2014/07/07 职场文书
领导干部作风建设自查报告
2014/10/23 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
SQLServer 错误: 15404,无法获取有关 Windows NT 组/用户 WIN-8IVSNAQS8T7\Administrator 的信息
2021/06/30 SQL Server