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 XMLHttpRequest对象全面剖析
Apr 24 Javascript
jquery鼠标滑过提示title具体实现代码
Aug 06 Javascript
javascript打印html内容功能的方法示例
Nov 28 Javascript
apply和call方法定义及apply和call方法的区别
Nov 15 Javascript
JavaScript实现数据类型的相互转换
Mar 06 Javascript
AngularJS入门教程之AngularJS指令
Apr 18 Javascript
简洁实用的BootStrap jQuery手风琴插件
Aug 31 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
Dec 05 jQuery
JS实现DOM删除节点操作示例
Apr 04 Javascript
jQuery实现动画、消失、显现、渐出、渐入效果示例
Sep 06 jQuery
原生JS实现自定义下拉单选选择框功能
Oct 12 Javascript
jQuery实现购物车的总价计算和总价传值功能
Nov 28 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
二十行语句实现从Excel到mysql的转化
2006/10/09 PHP
php file_put_contents()功能函数(集成了fopen、fwrite、fclose)
2011/05/24 PHP
php+mysql查询实现无限下级分类树输出示例
2016/10/03 PHP
php-app开发接口加密详解
2018/04/18 PHP
php通过各种函数判断0和空
2020/07/04 PHP
一个加载js文件的小脚本
2007/06/28 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
12种不宜使用的Javascript语法整理
2013/11/04 Javascript
jquery和ajax的关系详细介绍
2013/11/29 Javascript
使用canvas实现仿新浪微博头像截取上传功能
2015/09/02 Javascript
微信企业号开发之微信考勤Cookies的使用
2015/09/11 Javascript
vue绑定事件后获取绑定事件中的this方法
2018/09/15 Javascript
angular6 利用 ngContentOutlet 实现组件位置交换(重排)
2018/11/02 Javascript
简单了解小程序+node梳理登陆流程
2019/06/24 Javascript
详解Vue数据驱动原理
2020/11/17 Javascript
Python 绘图和可视化详细介绍
2017/02/11 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
2017/11/15 Python
Python基于socket模块实现UDP通信功能示例
2018/04/10 Python
python 调用有道api接口的方法
2019/01/03 Python
Python中函数的基本定义与调用及内置函数详解
2019/05/13 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Django模板获取field的verbose_name实例
2020/05/19 Python
Python 连接 MySQL 的几种方法
2020/09/09 Python
戴森美国官网:Dyson美国
2016/09/11 全球购物
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
英国最大的奢侈珠宝和手表网站:C W Sellors
2017/02/10 全球购物
宝拉珍选美国官网:Paula’s Choice美国
2018/01/07 全球购物
加拿大国民体育购物网站:National Sports
2018/11/04 全球购物
明确岗位职责
2015/02/14 职场文书
工商局个人工作总结
2015/03/03 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
python如何正确使用yield
2021/05/21 Python
Python进程池与进程锁之语法学习
2022/04/11 Python