OurJS


OurJS-我们的JS, 我们的技术-IT文摘; 专注JS相关领域;
我们热爱编程, 我们热爱技术;我们是高大上, 有品味的码农;

欢迎您订阅我们的技术周刊


我们会向您分享我们精心收集整理的,最新的行业资讯,技术动态,外文翻译,热点文章;
我们使用第三方邮件列表向您推送,我们不保存您的任何个人资料,注重您的隐私,您可以随时退订,

欢迎分享您的观点,经验,技巧,心得

让我们一起找寻程序员的快乐,探索技术, 发现IT人生的乐趣;


本网站使用缓存技术每次加载仅需很小流量, 可在手机中流畅浏览;
如果您发现任何BUG,请即时告知我们: ourjs(at)ourjs.com

JavaScript中splice与slice的区别、数组的复制以及在指定位置添加删除元素


分享到
分类 JS学习   关键字 JavaScript   发布 ourjs  1494229165475
注意 转载须保留原文链接,译文链接,作者译者等信息。  
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元素没有变化






参考:

http://w3school.com.cn/jsref/jsref_slice_array.asp

http://w3school.com.cn/jsref/jsref_splice.asp


社区评论 ( Beta版 )
OnceDoc 您自己的企业内容管理系统——文档、流程、知识库、报表、网盘All In One

访问404页面,寻找丢失儿童
 热门文章 - 分享最多
  1. JavaScript使用ES6的Class面向对象继承时 this is not defined 解决方法
  2. Java已快过时?斯坦福大学将JavaScript作为计算机科学入门课
  3. Docker改名Moby:急于商业化陷入品牌更名乱象
  4. TCP/UDP协议比较:在Node.JS中UDP服务器和客户端通信示例
  5. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  6. 2016 年崛起的 JS 项目
  7. 如何基于SVG矢量图制作一个可填写信息的可视化表单-OnceVI
  8. 周鸿祎:一些程序员没有商业意识,却又很自负,一看就知道不会创业
  9. 学哪种语言的最赚钱?调查显示JavaScript和SQL是程序员最常用的语言
  10. Node.JS更改Windows注册表regedit的几种方法
  11. AirJD-简单好用的免费建站工具

 相关阅读 - JS学习
  1. Node.JS中如何判断递归嵌套的所有回调函数已经执行完毕,以读取目录下所有文件为例:计数比Promise方式快将近一倍
  2. Node.js网页抓取:一个最简单的http请求客户端示例(request client)
  3. JavaScrip字符串模板表达式中的反引号怎么打?
  4. Node.JS用Socket实现FTP Server服务器和Client客户端
  5. Node.JS更改Windows注册表regedit的几种方法
  6. Debian下设置Linux Shell脚本开机自动启动Node.JS进程
  7. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法
  8. 可视化Web报表OnceVI中用户输入表单验证与提交
  9. Web报表OnceVI如何制作条形码与打印二维码(Barcode/Qrcode)
  10. 如何基于SVG矢量图制作一个可填写信息的可视化表单-OnceVI

 关键字 - JavaScript
  1. JavaScript中NaN的秘密
  2. decodeURIComponent有个BUG,当浏览器请求地址含%+数字时,会解析错误
  3. JavaScript也有getter/setter方法:ES5 Object对象的5个不为人知的特性
  4. JavaScript中splice与slice的区别、数组的复制以及在指定位置添加删除元素
  5. JavaScrip字符串模板表达式中的反引号怎么打?
  6. Node.JS更改Windows注册表regedit的几种方法
  7. AngularJS在大型单页面应用中的性能优化(二)
  8. WebPack:更优秀的模块依赖管理工具,及require.js的缺陷
  9. Debian下设置Linux Shell脚本开机自动启动Node.JS进程
  10. Node.JS通过原型和类继承EventEmitter,实现收发事件的几种方法

 欢迎订阅 - 技术周刊

我们热爱编程, 我们热爱技术; 我们是高端, 大气, 上档次, 有品味, 时刻需要和国际接轨的码农; 欢迎您订阅我们的技术周刊; 您只需要在右上角输入您的邮箱即可; 我们注重您的隐私,您可以随时退订.
加入我们吧! 让我们一起找寻码农的快乐,探索技术, 发现IT人生的乐趣;


 关注我们

我们的微信公众号: ourjs-com
打开微信扫一扫即可关注我们:
IT文摘-程序员(码农)技术周刊

ourjs官方微信号