JavaScript中数组slice和splice的对比小结


Posted in Javascript onSeptember 22, 2016

前言

今天重温了一下Javascript,看到了数组的方法,其中有两个比较相似的方法——splice和splice,看着很像,就是多了一个p,但是用法却相当不一样。

在使用中,可以通过选择一个具有强语义表达性的 API 来减少混淆的发生。

1、slice

slice是指定在一个数组中的元素创建一个新的数组,即原数组不会变

数组的 slice (ECMAScript 5.1 标准 15.4.4.10 节)非常类似于字符串的 slice。根据规范,slice 需要两个参数,起点和终点。它会返回一个包含了从起点开始,到终点之前之间所有元素的新数组。

理解 slice 的功能并不是太难:

'abc'.slice(1,2)   // "b"
[14, 3, 77].slice(1, 2) // [3]

需要特别注意的是它并不会修改原数组。

下面的代码段描述了这个行为,x 的值没有变,y 则是被截取的部分。

var x = [14, 3, 77];
var y = x.slice(1, 2);
console.log(x);   // [14, 3, 77]
console.log(y);   // [3]

2、splice

splice是JS中数组功能最强大的方法,它能够实现对数组元素的删除、插入、替换操作,返回值为被操作的值。

     splice删除:color.splice(1,2) (删除color中的1、2两项);

     splice插入:color.splice(1,0,'brown','pink') (在color键值为1的元素前插入两个值);

     splice替换:color.splice(1,2,'brown','pink')  (在color中替换1、2元素);

虽然 splice(15.4.4.12 节)也需要(至少)两个参数,但它的意义则完全不同。

[14, 3, 77].slice(1, 2)  // [3]
[14, 3, 77].splice(1, 2) // [3, 77]

除此之外,splice 还会改变原数组。

不要太惊讶,这正是 splice 的本意。

var x = [14, 3, 77]
var y = x.splice(1, 2)
console.log(x)   // [14]
console.log(y)   // [3, 77]

当你编写自己的模块时,选择一个最不容易发生混淆的 API 非常重要。理论上,你的用户不应该总是通过阅读文档来判断他们需要哪一个。那么我们应该遵循哪种命名规范呢?

我最熟悉的规范(与我之前在 QT 上的经验有关)是正确地选择动词:现在时表示可能的修改行为,过去时则不会修改原对象,而是返回一个新的版本。如果可以的话,这两种版本都要提供。

参考下面的例子:

var p = new Point(100, 75);
p.translate(25, 25);
console.log(p);  // { x: 125, y: 100 }
var q = new Point(200, 100);
var s = q.translated(10, 50);
console.log(q);  // { x: 200, y: 100 }
console.log(s);  // { x: 210, y: 150 }

注意(在二维笛卡尔坐标系中)移动位置的 translate() 和仅创建一个移动过的坐标的 translated() 之间的区别。调用 translate 会修改点 p 的值。然而,因为 translated() 不修改原对象,对象 q 没有被修改,而只返回了一个新的拷贝 s。

总结

如果这个规范能够非常一致地部署到你的应用中,那么上面提到的那种混淆则会被最大化地减低。以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助。

Javascript 相关文章推荐
关于extjs4如何获取grid修改后的数据的问题
Aug 07 Javascript
原生js操作checkbox用document.getElementById实现
Oct 12 Javascript
简单的jquery左侧导航栏和页面选中效果
Aug 21 Javascript
javascript引用赋值(地址传值)用法实例
Jan 13 Javascript
jquery validate和jquery form 插件组合实现验证表单后AJAX提交
Aug 26 Javascript
JS鼠标拖拽实例分析
Nov 23 Javascript
JavaScript 不支持 indexof 该如何解决
Mar 30 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
将input框中输入内容显示在相应的div中【三种方法可选】
May 08 Javascript
js实现简易聊天对话框
Aug 17 Javascript
react学习笔记之state以及setState的使用
Dec 07 Javascript
深入理解JavaScript中的并行处理
Sep 22 #Javascript
Actionscript与javascript交互实例程序(修改)
Sep 22 #Javascript
Javascript 调用 ActionScript 的简单方法
Sep 22 #Javascript
JavaScript与ActionScript3两者的同性与差异性
Sep 22 #Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
Sep 22 #Javascript
自制微信公众号一键排版工具
Sep 22 #Javascript
IONIC自定义subheader的最佳解决方案
Sep 22 #Javascript
You might like
Linux下CoreSeek及PHP扩展模块的安装
2012/09/23 PHP
Laravel 5 学习笔记
2015/03/06 PHP
JQuery jsonp 使用示例代码
2009/08/12 Javascript
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
javscript对象原型的一些看法
2010/09/19 Javascript
JavaScript中常用的运算符小结
2012/01/18 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
angularJS中$apply()方法详解
2015/01/07 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
Bootstrap3制作自己的导航栏
2016/05/12 Javascript
Highcharts学习之数据列
2016/08/03 Javascript
JavaScript下拉菜单功能实例代码
2017/03/01 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
vue组件中的样式属性scoped实例详解
2018/10/30 Javascript
如何检查一个对象是否为空
2019/04/11 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
零基础写python爬虫之打包生成exe文件
2014/11/06 Python
Python返回真假值(True or False)小技巧
2015/04/10 Python
python使用Apriori算法进行关联性解析
2017/12/21 Python
python处理数据,存进hive表的方法
2018/07/04 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python实现登录密码重置简易操作代码
2019/08/14 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
生物有机护肤品:Aurelia Probiotic Skincare
2018/01/31 全球购物
利物浦足球俱乐部官方商店(美国):Liverpool FC US
2019/10/09 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
打架检讨书800字
2014/01/10 职场文书
实习生岗位职责
2014/04/12 职场文书
大学生社会实践活动总结
2014/07/03 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
车间主任岗位职责范本
2015/04/08 职场文书
公司财务人员岗位职责
2015/04/14 职场文书
公司仓库管理制度
2015/08/04 职场文书
2016领导干部廉洁从政心得体会
2016/01/19 职场文书