资讯专栏INFORMATION COLUMN

深度剖析js数组

lordharrd / 627人阅读

摘要:且原始数组不会被修改。语法从上面的例子可以看到其实是重新开了一个内存块给新数组了,所以我们可以用来解决上面的问题在内存中开个新内存块给,这样就算你改了的内容,也不会变。

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也不会变。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108058.html

相关文章

  • js对象详解(JavaScript对象深度剖析深度理解js对象)

    摘要:对象详解对象深度剖析,深度理解对象这算是酝酿很久的一篇文章了。用空构造函数设置类名每个对象都共享相同属性每个对象共享一个方法版本,省内存。 js对象详解(JavaScript对象深度剖析,深度理解js对象) 这算是酝酿很久的一篇文章了。 JavaScript作为一个基于对象(没有类的概念)的语言,从入门到精通到放弃一直会被对象这个问题围绕。 平时发的文章基本都是开发中遇到的问题和对...

    CatalpaFlat 评论0 收藏0
  • 深度剖析 redux applyMiddleware 中 compose 构建异步数据流的思路

    摘要:前言本文作者站在自己的角度深入浅出算了别这么装逼分析在设计过程中通过构建异步数据流的思路。看上去那是相当的完美,根据咱们写代码的思路咱们来比对一下原版吧。时直接返回传入函数函数。 前言 本文作者站在自己的角度深入浅出...算了别这么装逼分析 redux applyMiddleware 在设计过程中通过 compose 构建异步数据流的思路。自己假设的一些场景帮助理解,希望大家在有异步数...

    tinylcy 评论0 收藏0
  • elasticsearch学习笔记高级篇(二)——filter执行原理深度剖析

    摘要:对于小或,不缓存。这样下次如果在有这个条件过来的时候,就不用重新扫描倒排索引,反复生成,可以大幅度提升性能。比好的原因除了不计算相关度分数以外还有这个。 下面详细讲一下为什么filter的性能很高,filter的底层原理究竟是什么? 通过一个搜索的场景来深入剖析一下,当一个filter搜索请求打到Elasticsearch的时候,ES会进行下面的操作: (1)在倒排索引中查找搜索串,获...

    ckllj 评论0 收藏0
  • 针对vue wtach一次详细的剖析

    摘要:提问深度与非深度的区别对象与数组与的区别的一个特点是,最初绑定的时候是不会执行的,要等到改变时才执行监听计算。为一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象适用场景一个数据影响多个数据。 提问 1.深度watch与非深度watch的区别;2.watch对象与数组;3.watch与computed的区别; immediate FullNa...

    crossoverJie 评论0 收藏0
  • 深度剖析凭什么python中整型不会溢出

    摘要:前言本次分析基于解释器,版本在时代,整型有类型和长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在后,统一使用了长整型。 前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数。在python3后,统一使用了长整型。这也是吸引科研人员的一部分了,适合大数据...

    MSchumi 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<