微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JavaScript中数组slice和splice的对比小结

前言

今天重温了一下Javascript,看到了数组的方法,其中有两个比较相似的方法——splice和splice,看着很像,就是多了一个p,但是用法却相当不一样。

在使用中,可以通过选择一个具有强语义表达性的 API 来减少混淆的发生。

1、slice

slice是指定在一个数组中的元素创建一个新的数组,即原数组不会变

数组的 slice (ECMAScript 5.1 标准 15.4.4.10 节)非常类似于字符串的 slice。根据规范,slice 需要两个参数,起点和终点。它会返回一个包含了从起点开始,到终点之前之间所有元素的新数组。

理解 slice 的功能并不是太难:

rush:js;"> 'abc'.slice(1,2) // "b" [14,3,77].slice(1,2) // [3]

需要特别注意的是它并不会修改原数组。

下面的代码段描述了这个行为,x 的值没有变,y 则是被截取的部分。

rush:js;"> var x = [14,77]; var y = x.slice(1,2); console.log(x); // [14,77] console.log(y); // [3]

2、splice

splice是JS中数组功能最强大的方法,它能够实现对数组元素的删除、插入、替换操作,返回值为被操作的值。

splice删除color.splice(1,2)删除color中的1、2两项);

splice插入:color.splice(1,'brown','pink') (在color键值为1的元素前插入两个值);

splice替换:color.splice(1,2,'pink') (在color中替换1、2元素);

虽然 splice(15.4.4.12 节)也需要(至少)两个参数,但它的意义则完全不同。

rush:js;"> [14,2) // [3] [14,77].splice(1,2) // [3,77]

除此之外,splice 还会改变原数组。

不要太惊讶,这正是 splice 的本意。

rush:js;"> var x = [14,77] var y = x.splice(1,2) console.log(x) // [14] console.log(y) // [3,77]

当你编写自己的模块时,选择一个最不容易发生混淆的 API 非常重要。理论上,你的用户不应该总是通过阅读文档来判断他们需要哪一个。那么我们应该遵循哪种命名规范呢?

我最熟悉的规范(与我之前在 QT 上的经验有关)是正确地选择动词:现在时表示可能的修改行为,过去时则不会修改原对象,而是返回一个新的版本。如果可以的话,这两种版本都要提供。

参考下面的例子:

rush:js;"> 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。

总结

如果这个规范能够非常一致地部署到你的应用中,那么上面提到的那种混淆则会被最大化地减低。以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助。

原文地址:https://www.jb51.cc/js/45649.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐