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 相关文章推荐
Jquery对象和Dom对象的区别分析
Nov 20 Javascript
jQuery DOM删除节点操作指南
Mar 03 Javascript
JavaScript使用DeviceOne开发实战(一) 配置和起步
Dec 01 Javascript
javascript如何写热点图
Dec 08 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
Dec 10 Javascript
jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)
Dec 22 Javascript
浅谈js中用$(#ID)来作为选择器的问题(id重复的时候)
Feb 14 Javascript
微信小程序 UI与容器组件总结
Feb 21 Javascript
javaScript 逻辑运算符使用技巧整理
May 03 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
Dec 22 Javascript
js实现GIF动图分解成多帧图片上传
Oct 24 Javascript
layui使用及简单的三级联动实现教程
Dec 01 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
source.php查看源文件
2006/12/09 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
PHP+Redis 消息队列 实现高并发下注册人数统计的实例
2018/01/29 PHP
SUN的《AJAX与J2EE》全文译了
2007/02/23 Javascript
ext 同步和异步示例代码
2009/09/18 Javascript
jquery.blockUI.js上传滚动等待效果实现思路及代码
2013/03/18 Javascript
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
jQuery数据类型小结(14个)
2016/01/08 Javascript
iscroll.js的上拉下拉刷新时无法回弹的解决方法
2016/02/18 Javascript
gulp-htmlmin压缩html的gulp插件实例代码
2016/06/06 Javascript
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
JavaScript键盘事件常见用法实例分析
2019/01/03 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
JS数据类型判断的几种常用方法
2020/07/07 Javascript
Element Popover 弹出框的使用示例
2020/07/26 Javascript
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
Python单元测试框架unittest使用方法讲解
2015/04/13 Python
python+pyqt实现12306图片验证效果
2017/10/25 Python
解决matplotlib库show()方法不显示图片的问题
2018/05/24 Python
python切片及sys.argv[]用法详解
2018/05/25 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
使用Python生成200个激活码的实现方法
2019/11/22 Python
pytorch  网络参数 weight bias 初始化详解
2020/06/24 Python
解决pytorch下出现multi-target not supported at的一种可能原因
2021/02/06 Python
草莓网化妆品加拿大网站:Strawberrynet Canada
2016/09/20 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
办加油卡单位介绍信
2014/01/09 职场文书
公司前台辞职报告
2014/01/19 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
小学生个人先进事迹材料
2014/05/08 职场文书
大学生学雷锋活动总结
2014/06/26 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
因家庭原因离职的辞职信范文
2015/05/12 职场文书
人代会简报
2015/07/21 职场文书
Python实现老照片修复之上色小技巧
2021/10/16 Python