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比较文档位置
Apr 08 Javascript
JQuery读取XML文件数据并显示的实现代码
Dec 16 Javascript
jQuery实现折线图的方法
Feb 28 Javascript
分享jQuery插件的学习笔记
Jan 14 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 Javascript
Node.js + Redis Sorted Set实现任务队列
Sep 19 Javascript
js时间戳与日期格式之间相互转换
Dec 11 Javascript
vue 使用Jade模板写html,stylus写css的方法
Feb 23 Javascript
jQuery使用动画队列自定义动画操作示例
Jun 16 jQuery
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
Node.js EventEmmitter事件监听器用法实例分析
Jan 07 Javascript
jQuery实现增删改查
Dec 22 jQuery
详解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
dedecms模板标签代码官方参考
2007/03/17 PHP
关于PHP5 Session生命周期介绍
2010/03/02 PHP
php allow_url_include的应用和解释
2010/04/22 PHP
PHP的变量类型和作用域详解
2014/03/12 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
php实现查询功能(数据访问)
2017/05/23 PHP
php表单处理操作
2017/11/16 PHP
PHP开启目录引索+fancyindex漂亮目录浏览带搜索功能
2019/09/23 PHP
JavaScript Title、alt提示(Tips)实现源码解读
2010/12/12 Javascript
js获取上传文件大小示例代码
2014/04/10 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
javascript模拟命名空间
2015/04/17 Javascript
JS之if语句对接事件动作逻辑(详解)
2017/06/28 Javascript
ReactNative Image组件使用详解
2017/08/07 Javascript
限时抢购-倒计时的完整实例(分享)
2017/09/17 Javascript
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
2017/09/19 NodeJs
vue2.0 常用的 UI 库实例讲解
2017/12/12 Javascript
vue中promise的使用及异步请求数据的方法
2018/11/08 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
2019/01/18 Javascript
基于node.js实现爬虫的讲解
2019/02/18 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
简单学习Python time模块
2016/04/29 Python
python代码过长的换行方法
2018/07/19 Python
Python中将两个或多个list合成一个list的方法小结
2019/05/12 Python
在Python中os.fork()产生子进程的例子
2019/08/08 Python
Django缓存Cache使用详解
2020/11/30 Python
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
高中自我鉴定范文
2013/11/03 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
给老婆的检讨书(搞笑版)
2015/05/06 职场文书
教育教学工作反思
2016/02/24 职场文书
浅谈JS和Nodejs中的事件驱动
2021/05/05 NodeJs
MySQL如何使备份得数据保持一致
2022/05/02 MySQL