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 相关文章推荐
js类中获取外部函数名的方法与代码
Sep 12 Javascript
Javascript WebSocket使用实例介绍(简明入门教程)
Apr 16 Javascript
JavaScript也谈内存优化
Jun 06 Javascript
js实现横向百叶窗效果网页切换动画效果的方法
Mar 02 Javascript
js实现动画特效的文字链接鼠标悬停提示的方法
Mar 02 Javascript
JavaScript获取表单内所有元素值的方法
Apr 02 Javascript
javaScript中的空值和假值
Dec 18 Javascript
Angular利用trackBy提升性能的方法
Jan 26 Javascript
jquery获取元素到屏幕四周可视距离的方法
Sep 05 jQuery
vue中datepicker的使用教程实例代码详解
Jul 08 Javascript
微信小程序实现pdf、word等格式文件上传的方法
Sep 10 Javascript
微信小程序实现加入购物车滑动轨迹
Nov 18 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
PHP 创建文件(文件夹)以及目录操作代码
2010/03/04 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
2010/12/29 PHP
PHP面向对象程序设计方法实例详解
2016/12/24 PHP
js实现的网站首页随机公告随机公告
2007/03/14 Javascript
某人初学javascript的时候写的学习笔记
2010/12/30 Javascript
jQuery的学习步骤
2011/02/23 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
jQuery中html()方法用法实例
2014/12/25 Javascript
js实现鼠标滚轮控制图片缩放效果的方法
2015/02/20 Javascript
jQuery控制网页打印指定区域的方法
2015/04/07 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
JQuery 动态生成Table表格实例代码
2016/12/02 Javascript
前端编码规范(3)JavaScript 开发规范
2017/01/21 Javascript
几种tab切换详解
2017/02/03 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
原生JS实现的碰撞检测功能示例
2018/05/18 Javascript
vue插槽slot的理解和使用方法
2019/04/03 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
Python实现从订阅源下载图片的方法
2015/03/11 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python实现识别手写数字大纲
2018/01/29 Python
python字符串切割:str.split()与re.split()的对比分析
2019/07/16 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
浅谈Tensorflow 动态双向RNN的输出问题
2020/01/20 Python
Python实现汇率转换操作
2020/05/03 Python
描述JSP和Servlet的区别、共同点、各自应用的范围
2012/10/02 面试题
网站开发实习生的自我评价
2013/12/11 职场文书
银行员工辞职信范文
2014/01/20 职场文书
关于读书的活动方案
2014/08/14 职场文书
村干部群众路线教育活动对照检查材料
2014/10/01 职场文书
家长反馈意见及建议
2015/06/03 职场文书
个人催款函范文
2015/06/24 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
手把手教你实现PyTorch的MNIST数据集
2021/06/28 Python