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的一句代码实现表格的简单筛选
Jul 26 Javascript
js日期联动示例
May 02 Javascript
js闭包的用途详解
Nov 09 Javascript
webpack中引用jquery的简单实现
Jun 08 Javascript
JavaScript_ECMA5数组新特性详解
Jun 12 Javascript
Javascript实现代码折叠功能
Aug 25 Javascript
js 性能优化之快速响应的用户界面
Feb 15 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
webpack学习教程之publicPath路径问题详解
Jun 17 Javascript
Javacript中自定义的map.js  的方法
Nov 26 Javascript
基于JavaScript获取base64图片大小
Oct 18 Javascript
jQuery实现容器间的元素拖拽功能
Dec 01 jQuery
深入理解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错误Allowed memory size of 67108864 bytes exhausted的3种解决办法
2014/07/28 PHP
php文件扩展名判断及获取文件扩展名的N种方法
2015/09/12 PHP
些很实用且必用的小脚本代码
2006/06/26 Javascript
为你的网站增加亮点的9款jQuery插件推荐
2011/05/03 Javascript
event对象获取方法总结在google浏览器下测试
2013/11/03 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jquery map方法使用示例
2014/04/23 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
jQuery倒计时代码(超简单)
2017/02/27 Javascript
关于react-router/react-router-dom v4 history不能访问问题的解决
2018/01/08 Javascript
Node.js使用cookie保持登录的方法
2018/05/11 Javascript
Vue+Element实现表格编辑、删除、以及新增行的最优方法
2019/05/28 Javascript
JS实现的对象去重功能示例
2019/06/04 Javascript
js数组中去除重复值的几种方法
2020/08/03 Javascript
[06:14]《辉夜杯》外卡赛附加赛 4支战队巡礼
2015/10/23 DOTA
[34:08]2018DOTA2亚洲邀请赛3月29日 小组赛B组 VP VS EG
2018/03/30 DOTA
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python求众数问题实例
2014/09/26 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python模块结构与布局操作方法实例分析
2017/07/24 Python
python调用staf自动化框架的方法
2018/12/26 Python
Python中zip()函数的简单用法举例
2019/09/02 Python
html5中的一些标签学习(心得)
2016/10/18 HTML / CSS
html5中使用hotcss.js实现手机端自适配的方法
2020/04/23 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
荷兰DOD药房中文官网:DeOnlineDrogist
2020/12/27 全球购物
.NET现在共支持多少种语言
2014/02/26 面试题
是否可以从一个static方法内部发出对非static方法的调用?
2014/08/18 面试题
更夫岗位责任制
2014/02/11 职场文书
学习党代会心得体会
2014/09/05 职场文书
临时租车协议范本
2014/09/23 职场文书
Django展示可视化图表的多种方式
2021/04/08 Python
Python道路车道线检测的实现
2021/06/27 Python
Python字符串格式化方式
2022/04/07 Python