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 16 Javascript
用js判断是否为360浏览器的实现代码
Jan 15 Javascript
浅谈类似于(function(){}).call()的js语句
Mar 30 Javascript
jQuery插件StickUp实现网页导航置顶
Apr 12 Javascript
去除html代码里面的script正则方法
May 19 Javascript
js canvas实现擦除动画
Jul 16 Javascript
详解Angular.js指令中scope类型的几种特殊情况
Feb 21 Javascript
微信公众号菜单配置微信小程序实例详解
Mar 31 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
Apr 21 Javascript
用ES6写全屏滚动插件的示例代码
May 02 Javascript
js DOM的事件常见操作实例详解
Dec 16 Javascript
Vue Router中应用中间件的方法
Aug 06 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 db类库进行数据库操作
2009/03/19 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
jquery cookie插件代码类
2009/05/26 Javascript
return false;和e.preventDefault();的区别
2010/07/11 Javascript
jQuery学习笔记(2)--用jquery实现各种模态提示框代码及项目构架
2013/04/08 Javascript
Jquery实现页面加载时弹出对话框代码
2013/04/19 Javascript
javascript 回到顶部效果的实现代码
2014/02/17 Javascript
angular.element方法汇总
2015/01/07 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
js 获取当前web应用的上下文路径实现方法
2016/08/19 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
JS实现仿百度文库评分功能
2017/01/12 Javascript
bootstrap表单按回车会自动刷新页面的解决办法
2017/03/08 Javascript
微信小程序商城项目之淘宝分类入口(2)
2017/04/17 Javascript
深入理解Nodejs Global 模块
2017/06/03 NodeJs
angular中实现li或者某个元素点击变色的两种方法
2017/07/27 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
python多线程操作实例
2014/11/21 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
Python一键安装全部依赖包的方法
2019/08/12 Python
使用Python进行中文繁简转换的实现代码
2019/10/18 Python
Python 调用有道翻译接口实现翻译
2020/03/02 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Python如何输出整数
2020/06/07 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
世界领先的26岁以下学生和青少年旅行预订网站:StudentUniverse
2018/07/01 全球购物
德国价格合理的品牌商品购物网站:averdo
2019/03/21 全球购物
大学生毕业自我评价范文分享
2013/11/11 职场文书
物流管理专业应届生求职信
2013/11/21 职场文书
企业演讲比赛主持词
2014/03/18 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书