JS的array.slice()和array.splice()的使用

JS中有两个操作数组的函数:slice(start,end)splice(start,length,insert_one,insert_two......),估计其意义大家都懂,简单说一下:

  1. array.slice(start,end)函数是取array数组中指定的一些元素(slice也是字符串截取方法,本文不提及):根据数组下标start和end,两个参数为取值的开始和结束下标,取出的值不包括end位置的值,生成一个新数组作为返回值;这里end可以为空,为空则取从start位置到数组结尾的元素,生成新数组
  2. array.splice(start,length,insert_one......)函数则是直接在原数组进行删除、添加、替换元素的操作:start为数组删除元素的开始下标,length为从start位置开始array删除元素的个数,后面参数为删除之后array重新插入的数据内容,插入位置为删除位置,而非数组开头或末尾,返回值为array删除的元素组成的数组。显而易见,splice函数可以用来对数组元素进行替换。由splice操作后的数组array,数组中内容如果已经改变,就再也找不回array在splice之前的模样。
但是如果只有这么多东西,我就不在这里讲了,W3c比我讲的好得多,进入正题。
例子:
在一次请求中,ajax返回的数据中有一个array数组,想要提取array中的某几个特殊位置的值做特殊使用,剩余的值为同一个类型的值(假定剩余几个值用处相同,但与前面取得几个特殊值用处不同),我们本可以使用splice()函数,剔除了该剔除的值做特殊使用,又剩下了能统一处理的元素,但是如果代码中不只一次的需要用到该array呢?处理一次过后就晚节不保了?再次使用array的时候已经是残羹冷炙了?
你估计会说,获取到array之后,定义一个变量,比如var temp = array;然后使用temp进行splice操作,这样最后的array还是最初的模样没改变,尝试一下之后就会发现,事实上,temp = array 这个过程,temp指向的是array的内存地址,对temp做的操作,即是对array做的操作。
如果不信,不妨试一下如下操作:
    var array = [1,2,3,true,"guo",10,];
    var temp = array;
    var a = temp.splice(3,1,4);
    var b = temp.splice(4,1,5);
    console.log(temp);   //1,2,3,4,5,10
    console.log(array);  //1,2,3,4,5,10
这时候,如果你感觉到绝望,应该想到slice()函数,为了temp 和 array 不指向同一个地址,slice可以实现,如下:
    var array = [1,2,3,true,"guo",10,];
    var temp = array.slice(0);
    var a = temp.splice(3,1,4);
    var b = temp.splice(4,1,5);
    console.log(temp);   //1,2,3,4,5,10
    console.log(array);  //1,2,3,true,"guo",10,
总结:
如果在内存空间创建一个数组var array = [7,8,9]之后,又创建了一个新的变量" var temp = array ",那么实际上temp和array指向的是同一个地址,当使用" temp[0] = 0 " 这样的赋值语句之后,array[0]也随之改变,只有通过"var  temp = [7,8,9] " 这样的语句给temp赋值,temp才会不与array指向同一地址,这时候,实际上是在内存空间重新建立了存储7,8,9的空间,然后将temp指向该空间,才不与array指向同一空间,即使新建的temp 与 array数组元素相同。
但是很多情况下,我们的数组是一个获得到的变量,需要多次使用,这是就需要“ var temp = array.slice(0) ”操作,达到新建内存空间,改变temp指向的目的。
拓展:
上述var temp = array.slice(0)的方法新建存储空间存储数据即为传说中的“深拷贝”,var temp=array,temp指向array内存地址的复制则为“浅拷贝”。
深拷贝还有一个方法是使用JSON类的方法,该方法可是实现复杂数据结构的深拷贝,例如:
var data = {
        a:1,
        b:["2","3","4"],
        c:true
    };
var temp = JSON.parse(JSON.stringify(data));
temp.a = 111;
console.log(data);
console.log(temp);
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值