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 相关文章推荐
JQuery 解析多维的Json数据格式
Nov 02 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
Oct 03 Javascript
使用非html5实现js板连连看游戏示例代码
Sep 22 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
js 数组去重的四种实用方法
Sep 09 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
jquery二级目录选中当前页的css样式
Dec 08 Javascript
JavaScript 隐性类型转换步骤浅析
Mar 15 Javascript
react native 文字轮播的实现示例
Jul 27 Javascript
ztree加载完成后显示勾选节点的实现代码
Oct 22 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
JavaScript流程控制(循环)
Dec 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提示Failed to write session data错误的解决方法
2014/12/17 PHP
php 中的closure用法详解
2017/06/12 PHP
PHP fprintf()函数用法讲解
2019/02/16 PHP
PHP实现创建一个RPC服务操作示例
2020/02/23 PHP
input 输入框获得/失去焦点时隐藏/显示文字(jquery版)
2013/04/02 Javascript
jQuery实现异步获取json数据的2种方式
2014/08/29 Javascript
JS冒泡事件与事件捕获实例详解
2016/11/25 Javascript
JavaScript数组迭代方法
2017/03/03 Javascript
windows下vue.js开发环境搭建教程
2017/03/20 Javascript
js匿名函数使用&传参(实例)
2017/09/08 Javascript
Vue实现动态添加或者删除对象和对象数组的操作方法
2018/09/21 Javascript
使用Vue+Django+Ant Design做一个留言评论模块的示例代码
2020/06/01 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
详解JavaScript中分解数字的三种方法
2021/01/05 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
python实现手机销售管理系统
2019/03/19 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
Python学习笔记之列表和成员运算符及列表相关方法详解
2019/08/22 Python
python 实现图片上传接口开发 并生成可以访问的图片url
2019/12/18 Python
python自动下载图片的方法示例
2020/03/25 Python
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
家用个人磨皮机:Trophy Skin
2017/03/30 全球购物
美国克罗格超市在线购物:Kroger
2019/06/21 全球购物
Android面试题附答案
2014/12/08 面试题
linux面试题参考答案(8)
2016/04/19 面试题
营业员演讲稿
2013/12/30 职场文书
幼儿园春季开学寄语
2014/04/03 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
个人违纪检讨书
2014/09/15 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
合作意向协议书
2015/01/29 职场文书
肖申克救赎观后感
2015/06/02 职场文书
单机多实例部署 MySQL8.0.20
2022/05/15 MySQL