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无限树状列表实现代码
Jan 11 Javascript
javascript算法学习(直接插入排序)
Apr 12 Javascript
一个不错的仿携程自定义数据下拉选择select
Sep 01 Javascript
纯javascript实现四方向文本无缝滚动效果
Jun 16 Javascript
JavaScript tab选项卡插件实例代码
Feb 23 Javascript
关于动态生成dom绑定事件失效的原因及解决方法
Aug 06 Javascript
B/S(Web)实时通讯解决方案分享
Apr 06 Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 Javascript
在使用JSON格式处理数据时应该注意的问题小结
May 20 Javascript
JavaScript多种页面刷新方法小结
Apr 04 Javascript
Vue3.0数据响应式原理详解
Oct 09 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 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实现清除wordpress里恶意代码
2015/10/21 PHP
在openSUSE42.1下编译安装PHP7 的方法
2015/12/24 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
js数据验证集合、js email验证、js url验证、js长度验证、js数字验证等简单封装
2010/05/15 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
用js读、写、删除Cookie代码分享及详细注释说明
2014/06/05 Javascript
JS实现常见的TAB、弹出层效果(TAB标签,斑马线,遮罩层等)
2015/10/08 Javascript
每天一篇javascript学习小结(Boolean对象)
2015/11/12 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
JS及PHP代码编写八大排序算法
2016/07/12 Javascript
如何使用bootstrap框架 bootstrap入门必看!
2017/04/13 Javascript
Three.js入门之hello world以及如何绘制线
2017/09/25 Javascript
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
微信小程序实现红包功能(后端PHP实现逻辑)
2018/07/11 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
layer.open提交子页面的form和layedit文本编辑内容的方法
2019/09/27 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
微信小程序单选框自定义赋值
2020/05/26 Javascript
原生JS实现多条件筛选
2020/08/19 Javascript
uni-app使用countdown插件实现倒计时
2020/11/01 Javascript
[02:05]2014DOTA2西雅图国际邀请赛 BBC第二天小组赛总结
2014/07/11 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
python 循环while和for in简单实例
2016/08/16 Python
python 遍历目录(包括子目录)下所有文件的实例
2018/07/11 Python
Python列表list排列组合操作示例
2018/12/18 Python
使用python实现离散时间傅里叶变换的方法
2019/09/02 Python
tensorflow与numpy的版本兼容性问题的解决
2021/01/08 Python
详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案
2021/01/29 Python
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
英国最大线上综合鞋类商城:Office
2017/12/08 全球购物
小学毕业感言150字
2014/02/05 职场文书
教育见习报告范文
2014/11/03 职场文书
个人简历求职信范文
2015/03/20 职场文书
导游词之无锡古运河
2019/11/14 职场文书
mysql批量新增和存储的方法实例
2021/04/07 MySQL