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 页面载入进度条实现代码
Feb 08 Javascript
GRID拖拽行的实例代码
Jul 18 Javascript
node.js中的path.resolve方法使用说明
Dec 08 Javascript
Javascript中数组方法汇总(推荐)
Apr 01 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
Vue.js 2.0 移动端拍照压缩图片预览及上传实例
Apr 27 Javascript
vue使用axios跨域请求数据问题详解
Oct 18 Javascript
详解Vue中localstorage和sessionstorage的使用
Dec 22 Javascript
使用express搭建一个简单的查询服务器的方法
Feb 09 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
Sep 16 Javascript
详解基于原生JS验证表单组件xy-form
Aug 20 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在不同页面间传递Json数据示例代码
2013/06/08 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
PHP7安装Redis扩展教程【Linux与Windows平台】
2016/09/30 PHP
jQuery 1.0.2
2006/10/11 Javascript
javascript delete 使用示例代码
2010/03/29 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
JS中多种方式创建对象详解
2016/03/22 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
express.js中间件说明详解
2019/03/19 Javascript
纯异步nodejs文件夹(目录)复制功能
2019/09/03 NodeJs
js实现图片3D轮播效果
2019/09/21 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
js里面的变量范围分享
2020/07/18 Javascript
[02:09]抵达西雅图!中国军团加油!
2014/07/07 DOTA
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
python对list中的每个元素进行某种操作的方法
2018/06/29 Python
使用python实现ftp的文件读写方法
2019/07/02 Python
使用python+poco+夜神模拟器进行自动化测试实例
2020/04/23 Python
Jupyter notebook快速入门教程(推荐)
2020/05/18 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
澳大利亚领先的女性运动服品牌:Lorna Jane
2020/06/19 全球购物
信息部岗位职责
2013/11/12 职场文书
给校长的建议书
2014/03/12 职场文书
党员干部承诺书范文
2014/03/25 职场文书
人事任命书格式
2014/06/05 职场文书
2014年学校教学工作总结
2014/12/06 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
青涩记忆观后感
2015/06/18 职场文书
母亲节感言
2015/08/03 职场文书
python自动化测试通过日志3分钟定位bug
2021/11/20 Python
NodeJs使用webpack打包项目的方法详解
2022/02/28 NodeJs
星际争霸 Light vs Action 一场把教主看到鬼畜的比赛
2022/04/01 星际争霸
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
win10音频服务未响应怎么解决?win10音频服务未响应未修复的解决方法
2022/08/14 数码科技