深度剖析js数组


1、数组是引用类型

大家应该都知道数组和对象都是引用类型,如果一个数组赋值给另外一个数组只是将该数组的引用地址赋给另一个数组!比如:

    let a = [{
        id:1.
        name:'zhangwei',
        age:18
    }];
    
    let b = a;//这里将a的引用地址的指针指向了b,所以如果你想获取b的内容,其实就是获取a的内容,相当于给a开了一个副本

上面的代码有一定的副作用:就是如果你改变了a的值那么b的值就会跟着变化,这也就是引用地址造成的,因为a和b指针指向的是同一个内存区域,如:

    a.name = 'lilei'
    console.log(b.name)//这时候b.name 就是 'lilei'
2、断开数组间的引用地址

像上面的 “副作用” 我们如何解决呢?因为我不想改变了a的同时让b也变化!其实方法也有好多种,网上百度一下应该也能查到,这里我使用的是我目前使用的方法 array的slice()方法,按照MDN Array slice 上面的说明:

   slice() 方法返回一个从开始到结束(不包括结束)选择的数组的一部分浅拷贝到一个新数组对象。且原始数组不会被修改。

语法Edit
arr.slice();
// [0, end]

arr.slice(begin);
// [begin, end]

arr.slice(begin, end);
// [begin, end)

var animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]

console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]

从上面的例子可以看到slice其实是重新开了一个内存块给新数组了,所以我们可以用来解决上面的问题:

let a = [{
        id:1.
        name:'zhangwei',
        age:18
    }];
let b = a.slice();//在内存中开个新内存块给b,这样就算你改了a的内容,b也不会变。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>