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 简练的几个函数
Aug 29 Javascript
js获取dom的高度和宽度(可见区域及部分等等)
Jun 13 Javascript
探讨JQUERY JSON的反序列化类 using问题的解决方法
Dec 19 Javascript
jQuery中scrollLeft()方法用法实例
Jan 16 Javascript
jquery实现Slide Out Navigation滑出式菜单效果代码
Sep 07 Javascript
easyui window refresh 刷新两次的解决方法(推荐)
May 18 Javascript
jQuery数据检索中根据关键字快速定位GridView指定行的实现方法
Jun 08 Javascript
React-intl 实现多语言的示例代码
Nov 03 Javascript
element ui 对话框el-dialog关闭事件详解
Feb 26 Javascript
jQuery实现简单复制json对象和json对象集合操作示例
Jul 09 jQuery
微信小程序canvas拖拽、截图组件功能
Sep 04 Javascript
Vue如何基于es6导入外部js文件
May 15 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
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
2017/03/23 PHP
Yii2使用$this->context获取当前的Module、Controller(控制器)、Action等
2017/03/29 PHP
PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】
2017/11/16 PHP
php计数排序算法的实现代码(附四个实例代码)
2020/03/31 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
jquery滚动组件(vticker.js)实现页面动态数据的滚动效果
2013/07/03 Javascript
jquery选择器、属性设置用法经验总结
2013/09/08 Javascript
Ajax同步与异步传输的示例代码
2013/11/21 Javascript
asp.net+jquery.form实现图片异步上传的方法(附jquery.form.js下载)
2016/05/05 Javascript
window.onload绑定多个事件的两种解决方案
2016/05/15 Javascript
JS实现简单的天数计算器完整实例
2017/04/28 Javascript
easyui下拉框动态级联加载的示例代码
2017/11/29 Javascript
JavaScript事件对象event用法分析
2018/07/27 Javascript
小程序实现多列选择器
2019/02/15 Javascript
iview tabs 顶部导航栏和模块切换栏的示例代码
2019/03/04 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
vue开发拖拽进度条滑动组件
2019/09/21 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
如何在 Vue 中使用 JSX
2021/02/14 Vue.js
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
Python内存映射文件读写方式
2020/04/24 Python
Python实现GIF图倒放
2020/07/16 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
详解Selenium 元素定位和WebDriver常用方法
2020/12/04 Python
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
Omio美国:全欧洲低价大巴、火车和航班搜索和比价
2017/11/08 全球购物
英国奢侈皮具品牌:Aspinal of London
2018/09/02 全球购物
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
外国语学院毕业生自荐信
2013/10/28 职场文书
中国央视网签名寄语
2014/01/18 职场文书
监理中标通知书
2015/04/16 职场文书
读书笔记怎么写
2015/07/01 职场文书
MySQL时区造成时差问题
2022/04/13 MySQL