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 相关文章推荐
Javascript 函数对象的多重身份
Jun 28 Javascript
JQuery从头学起第二讲
Jul 04 Javascript
jquery获取tr中控件值并操作tr实现思路
Mar 27 Javascript
分享28款免费实用的 JQuery 图片和内容滑块插件
Dec 15 Javascript
深入分析Cookie的安全性问题
Mar 01 Javascript
理解JavaScript的变量的入门教程
Jul 07 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
Nov 02 Javascript
详解页面滚动值scrollTop在FireFox与Chrome浏览器间的兼容问题
Dec 03 Javascript
BootStrap的JS插件之轮播效果案例详解
May 16 Javascript
vue.js 2.*项目环境搭建、运行、打包发布的详细步骤
May 01 Javascript
vue中动态select的使用方法示例
Oct 28 Javascript
javascript/jquery实现点击触发事件的方法分析
Nov 11 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
?繁体转换的class
2006/10/09 PHP
用PHP实现ODBC数据分页显示一例
2006/10/09 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP程序级守护进程的实现与优化的使用概述
2013/05/02 PHP
IIS下PHP的三种配置方式对比
2014/11/20 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
对于Laravel 5.5核心架构的深入理解
2018/02/22 PHP
PHP实现分布式memcache设置web集群session同步的方法
2018/04/10 PHP
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
jQuery事件的绑定、触发、及监听方法简单说明
2016/05/10 Javascript
倾力总结40条常见的移动端Web页面问题解决方案
2016/05/24 Javascript
基于node.js依赖express解析post请求四种数据格式
2017/02/13 Javascript
jQuery快速高效制作网页交互特效
2017/02/24 Javascript
js实现显示手机号码效果
2017/03/09 Javascript
使用mint-ui开发项目的一些心得(分享)
2017/09/07 Javascript
vue实现文章内容过长点击阅读全文功能的实例
2017/12/28 Javascript
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
vue项目每30秒刷新1次接口的实现方法
2018/12/04 Javascript
jquery实现图片无缝滚动 蒙版遮蔽效果
2020/01/11 jQuery
js实现文章目录索引导航(table of content)
2020/05/10 Javascript
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
Python使用selenium + headless chrome获取网页内容的方法示例
2019/10/16 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
python如何查看安装了的模块
2020/06/23 Python
Selenium 配置启动项参数的方法
2020/12/04 Python
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
美国羊皮公司:Overland
2018/01/15 全球购物
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
链表面试题-一个链表的结点结构
2015/05/04 面试题
医院总经理岗位职责
2014/02/04 职场文书
小学生读书感言
2014/02/12 职场文书
1亿有多大教学反思
2014/05/01 职场文书
物流专业求职信
2014/06/30 职场文书
党员学习中共十八大报告思想汇报
2014/09/15 职场文书
计算机专业自荐信
2015/03/05 职场文书