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 去字符串空格终极版(支持utf8)
Nov 14 Javascript
jQuery 数据缓存data(name, value)详解及实现
Jan 04 Javascript
JavaScript日历实现代码
Sep 12 Javascript
JavaScript计算字符串中每个字符出现次数的小例子
Jul 02 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
Dec 04 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
Sep 24 Javascript
手机端图片缩放旋转全屏查看PhotoSwipe.js插件实现
Aug 25 Javascript
vue+vuex+axios实现登录、注册页权限拦截
Mar 09 Javascript
原生JavaScript实现remove()和recover()功能示例
Jul 24 Javascript
详解微信小程序框架wepy踩坑记录(与vue对比)
Mar 12 Javascript
Node.js如何优雅的封装一个实用函数的npm包的方法
Apr 29 Javascript
node使用mysql获取数据库数据中文乱码问题的解决
Dec 02 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跨站攻击实例分析
2014/10/28 PHP
php检测数组长度函数sizeof与count用法
2014/11/17 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP获取文本框、密码域、按钮的值实例代码
2017/04/19 PHP
laravel 使用事件系统统计浏览量的实现
2019/10/16 PHP
7款风格新颖的jQuery/CSS3菜单导航分享
2013/04/23 Javascript
jQuery实现类似滑动门切换效果的层切换
2013/09/23 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
微信小程序 轮播图swiper详解及实例(源码下载)
2017/01/11 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
基于openlayers4实现点的扩散效果
2020/08/17 Javascript
JS对象和字符串之间互换操作实例分析
2019/02/02 Javascript
JS实现数据动态渲染的竖向步骤条
2020/06/24 Javascript
[12:21]VICI vs TNC (BO3)
2018/06/07 DOTA
Python多进程通信Queue、Pipe、Value、Array实例
2014/11/21 Python
python实现图片变亮或者变暗的方法
2015/06/01 Python
Python随机生成数据后插入到PostgreSQL
2016/07/28 Python
聊聊Python中的pypy
2018/01/12 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
2018/04/25 Python
Python实现的多项式拟合功能示例【基于matplotlib】
2018/05/15 Python
python每5分钟从kafka中提取数据的例子
2019/12/23 Python
python GUI库图形界面开发之PyQt5切换按钮控件QPushButton详细使用方法与实例
2020/02/28 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
使用Python封装excel操作指南
2021/01/29 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
美国婴儿和儿童家具网上商店:ABaby.com
2018/07/02 全球购物
iHerb俄罗斯:维生素、补品和天然产品
2020/07/09 全球购物
营销主管自我评价怎么写
2013/09/19 职场文书
2014年最新党员对照检查材料汇总
2014/09/15 职场文书
贵阳市党的群众路线教育实践活动党(工)委领导班子整改方案
2014/10/26 职场文书
2014年企业团支部工作总结
2014/12/10 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL