JavaScript中数组slice和splice的对比小结
前言
今天重温了一下Javascript,看到了数组的方法,其中有两个比较相似的方法——splice和splice,看着很像,就是多了一个p,但是用法却相当不一样。
在使用中,可以通过选择一个具有强语义表达性的API来减少混淆的发生。
1、slice
slice是指定在一个数组中的元素创建一个新的数组,即原数组不会变
数组的slice(ECMAScript5.1标准15.4.4.10节)非常类似于字符串的slice。根据规范,slice需要两个参数,起点和终点。它会返回一个包含了从起点开始,到终点之前之间所有元素的新数组。
理解slice的功能并不是太难:
'abc'.slice(1,2)//"b" [14,3,77].slice(1,2)//[3]
需要特别注意的是它并不会修改原数组。
下面的代码段描述了这个行为,x的值没有变,y则是被截取的部分。
varx=[14,3,77]; vary=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的本意。
varx=[14,3,77] vary=x.splice(1,2) console.log(x)//[14] console.log(y)//[3,77]
当你编写自己的模块时,选择一个最不容易发生混淆的API非常重要。理论上,你的用户不应该总是通过阅读文档来判断他们需要哪一个。那么我们应该遵循哪种命名规范呢?
我最熟悉的规范(与我之前在QT上的经验有关)是正确地选择动词:现在时表示可能的修改行为,过去时则不会修改原对象,而是返回一个新的版本。如果可以的话,这两种版本都要提供。
参考下面的例子:
varp=newPoint(100,75); p.translate(25,25); console.log(p);//{x:125,y:100} varq=newPoint(200,100); vars=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。
总结
如果这个规范能够非常一致地部署到你的应用中,那么上面提到的那种混淆则会被最大化地减低。以上就是这篇文章的全部内容了,希望能对大家的学习或者工作带来一定的帮助。