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 相关文章推荐
如何快速的呈现我们的网页的技巧整理
Jul 01 Javascript
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
Jquery之Ajax运用 学习运用篇
Sep 26 Javascript
js使用数组判断提交数据是否存在相同数据
Nov 27 Javascript
利用js制作html table分页示例(js实现分页)
Apr 25 Javascript
javascript属性访问表达式用法分析
Apr 25 Javascript
基于jquery animate操作css样式属性小结
Nov 27 Javascript
Bootstrap超大屏幕的实现代码
Mar 22 Javascript
关于JS与jQuery中的文档加载问题
Aug 22 jQuery
vue中更改数组中属性,在页面中不生效的解决方法
Oct 30 Javascript
Js视频播放器插件Video.js使用方法详解
Feb 04 Javascript
JQuery基于FormData异步提交数据文件
Sep 01 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
PHP4实际应用经验篇(4)
2006/10/09 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
2011/07/10 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
PHP 面向对象详解
2012/09/13 PHP
PHP mysql与mysqli事务使用说明 分享
2013/08/17 PHP
php中file_get_content 和curl以及fopen 效率分析
2014/09/19 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
2018/12/07 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
Javascript和Java获取各种form表单信息的简单实例
2014/02/14 Javascript
javascript中String对象的slice()方法分析
2014/12/20 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
js实现模拟计算器退格键删除文字效果的方法
2015/05/07 Javascript
javascript基础知识
2016/06/07 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
手把手教你使用TypeScript开发Node.js应用
2019/05/06 Javascript
Vue程序调试的方法
2019/06/17 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
[43:47]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第一局
2016/03/05 DOTA
python基础教程项目四之新闻聚合
2018/04/02 Python
使用matplotlib画散点图的方法
2018/05/25 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python利用wx实现界面按钮和按钮监听和字体改变的方法
2019/07/17 Python
python中with用法讲解
2020/02/07 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
python怎么提高计算速度
2020/06/11 Python
Python页面加载的等待方式总结
2021/02/28 Python
美国肌肉和力量商店:Muscle & Strength
2019/06/22 全球购物
生物科学专业个人求职信范文
2013/12/05 职场文书
材料会计岗位职责
2014/03/06 职场文书
小学生思想品德评语
2014/12/31 职场文书
寒山寺导游词
2015/02/03 职场文书
2015年感恩节活动总结
2015/03/24 职场文书
红高粱观后感
2015/06/10 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python matplotlib绘制雷达图
2022/04/13 Python