美文网首页
(四)变量的存储栈和堆-深浅拷贝

(四)变量的存储栈和堆-深浅拷贝

作者: 萘小蒽 | 来源:发表于2019-03-04 14:14 被阅读0次

前面讲了js变量的基础类型和引用类型,我们来总结一下这两个类型的特点。

基础类型:按值访问,可以操作实际值。

引用类型:值是保存在内存中的对象。js不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时, 实际上是在操作对象的引用而不是实际的对象。

我们再来看栈和堆的存储说明

栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值引用类型的地址

堆:动态分配的内存,大小不定,也不会自动释放。里面存放引用类型的值

20180511101107567.png

由上面的基础,我们再来区分什么是浅拷贝和深拷贝。

浅拷贝

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。

基础数据类型的浅拷贝
var a  = 1 ;
var b =  a ;
b = 2;
a  // 1
b // 2
  
引用类型的浅拷贝
var arr = [1, 2, 3];
var arr2 = arr;
arr2[2] = 4;
console.log(arr)
[1, 2, 4]

深拷贝

被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。即对象的浅拷贝会对“主”对象进行拷贝,但不会复制主对象里面的对象。”里面的对象“会在原来的对象和它的副本之间共享。
我们可以借助引用类型的方法进行深拷贝;

数组

for 循环

let arr1 = [1,2,3];
let arr2 = copyArr(arr1);
function copyArr(arr){
    let res=[];
    for(let i=0,length=arr.length;i<length;i++){
        res.push(arr[i]);
    }
    return res;
}

slice

let arr1 = [1,2,3];
let arr2 = arr1.slice(0);

concat

let arr1 = [1,2,3];
let arr2 = arr1.concat();

扩展运算符

let arr1 = [1,2,3];
let arr2 = [...arr1];

对象也同理

但是要强调一点:ES6新增了Object.assign()方法
第一个参数是目标对象,之后还可以跟一个或多个源对象。它会遍历一个或多个源对象可枚举的自有键并把它们复制到目标对象,最后返回目标对象
assign是使用=操作符来赋值,

Object.assign() 只是一级属性复制,比浅拷贝多深拷贝了一层而已。用的时候,还是要注意这个问题

相关文章

  • (四)变量的存储栈和堆-深浅拷贝

    前面讲了js变量的基础类型和引用类型,我们来总结一下这两个类型的特点。 基础类型:按值访问,可以操作实际值。 引用...

  • 深浅拷贝的异同

    深浅拷贝异同主要体现于可变对象上,对于tuple之类的不可变对面,深浅拷贝后,地址值和变量值都是一样的,但是对与l...

  • js的深浅拷贝

    js的深浅拷贝可以分为数组的深浅拷贝和对象的深浅拷贝 一、数组的深浅拷贝如果只是简单的将数组中的元素付给另外一个数...

  • js深浅拷贝

    所谓的深浅拷贝是相对与typeof === 'object' 而言的,数组是用堆对应保存的。浅拷贝:拷贝了对象的存...

  • Java之深浅拷贝

    Java之深浅拷贝 基本类型:拷贝数据的值其他类型:拷贝地址的引用,拷贝出的新对象与原对象共享实例变量,不受访问权...

  • 深、浅拷贝

    说到深浅拷贝,Python和其他语言一样也涉及到内存分配问题,对象的赋值和拷贝有很大差别,赋值是把变量和内存某块连...

  • 2018-08-29

    深浅拷贝 1.根据拷贝内容的不同,分为深浅拷贝 深拷贝:内容...

  • 浅谈js中的深拷贝与浅拷贝

    什么是深拷贝,什么是浅拷贝 说到深浅拷贝,就不得不提到另外一个知识点,那就是引用类型和基本类型以及堆和栈的区别。再...

  • 【03】手动实现深拷贝

    在上文中,已经提到了深浅拷贝的概念,以及常用的深浅拷贝的方法。这里进行一个简单的回顾: 改变了一个变量的值,其他变...

  • 深入理解深浅拷贝

    再次深入探究了深浅拷贝的东西。非容器类和容器类的深浅拷贝大致相似,不可变类型的copy拷贝是浅拷贝,mutable...

网友评论

      本文标题:(四)变量的存储栈和堆-深浅拷贝

      本文链接:https://www.haomeiwen.com/subject/ecfduqtx.html