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 encodeURI和encodeURIComponent的比较
Apr 03 Javascript
js验证输入是否为手机号码或电话号码示例
Dec 30 Javascript
node.js中的fs.createWriteStream方法使用说明
Dec 17 Javascript
页面内容排序插件jSort使用方法
Oct 10 Javascript
JS实现部分HTML固定页面顶部随屏滚动效果
Dec 24 Javascript
jQuery内容过滤选择器用法示例
Sep 09 Javascript
Ubuntu 16.04 64位中搭建Node.js开发环境教程
Oct 19 Javascript
浅析jQuery操作select控件的取值和设值
Dec 07 Javascript
使用vue.js实现checkbox的全选和多个的删除功能
Feb 17 Javascript
微信小程序 支付功能实现PHP实例详解
May 12 Javascript
jQuery实现DIV响应鼠标滑过由下向上展开效果示例【测试可用】
Apr 26 jQuery
原生js实现自定义消息提示框
Nov 19 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自定义错误日志
2015/02/13 PHP
PHP随手笔记整理之PHP脚本和JAVA连接mysql数据库
2015/11/25 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
2012/02/27 Javascript
关于火狐(firefox)及ie下event获取的两种方法
2012/12/27 Javascript
jquery日历插件datepicker用法分析
2016/01/22 Javascript
jquery实现页面常用的返回顶部效果
2016/03/04 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
详解Angular的数据显示优化处理
2016/12/26 Javascript
jquery.tableSort.js表格排序插件使用方法详解
2020/08/12 Javascript
详解vue-cli开发环境跨域问题解决方案
2017/06/06 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
Vue项目报错:Uncaught SyntaxError: Unexpected token
2018/11/10 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
Python实现的数据结构与算法之队列详解
2015/04/22 Python
Python标准库笔记struct模块的使用
2018/02/22 Python
Python线程之定位与销毁的实现
2019/02/17 Python
Python小进度条显示代码
2019/03/05 Python
python 多线程对post请求服务器测试并发的方法
2019/06/13 Python
python笔记_将循环内容在一行输出的方法
2019/08/08 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
浅谈CSS3中的变形功能-transform功能
2017/12/27 HTML / CSS
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
十八届三中全会学习方案
2014/02/16 职场文书
德语专业求职信
2014/03/12 职场文书
铁路安全事故反思
2014/04/26 职场文书
物理学专业自荐信
2014/06/11 职场文书
课程设计的心得体会
2014/09/03 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
会议通知格式范文
2015/04/15 职场文书
乒乓球比赛通知
2015/04/27 职场文书
大学班干部竞选稿
2015/11/20 职场文书
《天使的翅膀》读后感3篇
2019/12/20 职场文书
python单向链表实例详解
2022/05/25 Python