javascript,引用类型,直接赋值、浅拷贝和深拷贝(含:深入剖析深拷贝)

从零到一:用ROS2和Gazebo搭建Franka机械臂仿真环境(避坑指南) 本文详细介绍了如何使用ROS2和Gazebo从零开始搭建Franka机械臂的仿真环境,包括环境准备、ROS2包安装、控制器配置及常见问题解决方案。特别针对关节位置控制等核心功能提供了实用代码示例和避坑指南,帮助开发者高效构建机器人算法验证平台。 阅读详情

直接赋值、浅拷贝和深拷贝对比

一、对象

1、直接赋值:赋值的是引用,被复制的对象的所有变量、对象仍然指向原对象。

2、浅拷贝:被复制的对象的所有变量,都含有与原对象相同的值,而所有的对其他对象的引用仍然指向原对象。

3、深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,把要复制的对象所引用的对象都复制了一遍。 

二、
转载于:https://www.zhihu.com/question/23031215/answer/46220227

首先深复制和浅复制只针对像 Object, Array 这样的复杂对象的。

简单来说,

1、直接赋值,没复制一层对象的属性,

2、浅复制,只复制一层对象的属性,

3、深复制,则递归复制了对象所有层级的属性。

下面是一个赋值例子:

var aa = {
    a: 2, 
    b: 5, 
    c: {
        'hh': 10
        }
}; 
var mm = aa;
mm.b = 66; 
console.log(mm, aa)     //{a: 2, b: 66, c: {'hh': 10}}   {a: 2, b: 66,c: {'hh': 10}}

 

下面是一个简单的浅复制例子:

var obj = { a:1, arr: [2,3] };
var shallowObj = shallowCopy(obj);

function shallowCopy(src) {
  var dst = {};
  for (var prop in src) {
    if (src.hasOwnProperty(prop)) {
      dst[prop] = src[prop];
    }
  }
  return dst;
}


shallowObj.a = 11;
console.log(shallowObj, obj); //{a: 11, arr:[2, 3]}    {a: 1, arr: [2, 3]}

 

因为浅复制只会将对象的各个属性进行依次复制,并不会进行递归复制,而 JavaScript 存储对象都是存地址的,所以浅复制会导致 obj.arr 和 shallowObj.arr 指向同一块内存地址,大概的示意图如下。

 

导致的结果就是:

shallowObj.arr[1] = 5;
obj.arr[1]   // = 5

 

而深复制则不同,它不仅将原对象的各个属性逐个复制出去,而且将原对象各个属性所包含的对象也依次采用深复制的方法递归复制到新对象上。这就不会存在上面 obj 和 shallowObj 的 arr 属性指向同一个对象的问题。

var obj = { a:1, arr: [1,2] };
var obj2 = deepCopy(obj);

 

结果如下面的示意图所示:

 

需要注意的是,如果对象比较大,层级也比较多,深复制会带来性能上的问题。在遇到需要采用深复制的场景时,可以考虑有没有其他替代的方案。在实际的应用场景中,也是浅复制更为常用。

三、

转载于:https://www.cnblogs.com/Chen-XiaoJun/p/6217373.html

在 JS 中有一些基本类型像是Number、String、Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他们的传值方式。

基本类型是按值传递,像是这样:在修改a时并不会改到b

var a = 25;
var b = a;
b = 18;
console.log(a);//25
console.log(b);//18

但对象就不同,对象传的是按引用传值:

var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = obj1;
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 100, c: 30 } <-- b 被改到了
console.log(obj2);
// { a: 10, b: 100, c: 30 }

复制一份obj1叫做obj2,然后把obj2.b改成100,但却不小心改到obj1.b,因为他们根本是同一个对象,这就是所谓的浅拷贝。

要避免这样的错误发生就要写成这样:

var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c };
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- b 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }

这样就是深拷贝,不会改到原本的obj1。

浅拷贝(Shallow Copy) VS 深拷贝(Deep Copy)

浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

浅拷贝的实现方式

也就是简单地复制而已

1、简单地复制语句

  <script type="text/javascript">
    function simpleClone(initalObj) {    
      var obj = {};    
      for ( var i in initalObj) {
        obj[i] = initalObj[i];
      }    
      return obj;
    }

    var obj = {
      a: "hello",
      b:{
          a: "world",
          b: 21
        },
      c:["Bob", "Tom", "Jenny"],
      d:function() {
          alert("hello world");
        }
    }
    var cloneObj = simpleClone(obj); 
    console.log(cloneObj.b); 
    console.log(cloneObj.c);
    console.log(cloneObj.d);

    cloneObj.b.a = "changed";
    cloneObj.c = [1, 2, 3];
    cloneObj.d = function() { alert("changed"); };
    console.log(obj.b);
    console.log(obj.c);
    console.log(obj.d);
  </script>

结果为:

2、Object.assign()

Object.assign是ES6的新函数。Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign() 进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

Object.assign(target, ...sources)

参数:

target:目标对象。
sources:任意多个源对象。
返回值:目标对象会被返回。

var obj = { a: {a: "hello", b: 21} };
var initalObj = Object.assign({}, obj);

initalObj.a.a = "changed";
console.log(obj.a.a); // "changed"

兼容性:

需要注意的是:

Object.assign()可以处理一层的深度拷贝,如下:
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = Object.assign({}, obj1);
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }

深拷贝的实现方式

要完全复制又不能修改到原对象,这时候就要用 Deep Copy,这里会介绍几种Deep Copy 的方式。

1、手动复制

把一个对象的属性复制给另一个对象的属性

var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = { a: obj1.a, b: obj1.b, c: obj1.c };
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }

但这样很麻烦,要一个一个自己复制;而且这样的本质也不能算是 Deep Copy,因为对象里面也可能回事对象,如像下面这个状况:

var obj1 = { body: { a: 10 } };
var obj2 = { body: obj1.body };
obj2.body.a = 20;
console.log(obj1);
// { body: { a: 20 } } <-- 被改到了
console.log(obj2);
// { body: { a: 20 } }
console.log(obj1 === obj2);
// false
console.log(obj1.body === obj2.body);
// true

虽然obj1跟obj2是不同对象,但他们会共享同一个obj1.body,所以修改obj2.body.a时也会修改到旧的。

2、对象只有一层的话可以使用上面的:Object.assign()函数

Object.assign({}, obj1)的意思是先建立一个空对象{},接着把obj1中所有的属性复制过去,所以obj2会长得跟obj1一样,这时候再修改obj2.b也不会影响obj1。

因为Object.assign跟我们手动复制的效果相同,所以一样只能处理深度只有一层的对象,没办法做到真正的 Deep Copy。不过如果要复制的对象只有一层的话可以考虑使用它。

3、转成 JSON 再转回来

用JSON.stringify把对象转成字符串,再用JSON.parse把字符串转成新的对象。

var obj1 = { body: { a: 10 } };
var obj2 = JSON.parse(JSON.stringify(obj1));
obj2.body.a = 20;
console.log(obj1);
// { body: { a: 10 } } <-- 沒被改到
console.log(obj2);
// { body: { a: 20 } }
console.log(obj1 === obj2);
// false
console.log(obj1.body === obj2.body);
// false

这样做是真正的Deep Copy,这种方法简单易用。

但是这种方法也有不少坏处,譬如它会抛弃对象的constructor。也就是深拷贝之后,不管这个对象原来的构造函数是什么,在深拷贝之后都会变成Object。

这种方法能正确处理的对象只有 Number, String, Boolean, Array, 扁平对象,即那些能够被 json 直接表示的数据结构。RegExp对象是无法通过这种方式深拷贝。

也就是说,只有可以转成JSON格式的对象才可以这样用,像function没办法转成JSON。

var obj1 = { fun: function(){ console.log(123) } };
var obj2 = JSON.parse(JSON.stringify(obj1));
console.log(typeof obj1.fun);
// 'function'
console.log(typeof obj2.fun);
// 'undefined' <-- 没复制

要复制的function会直接消失,所以这个方法只能用在单纯只有数据的对象。

4、递归拷贝

function deepClone(initalObj, finalObj) {    
  var obj = finalObj || {};    
  for (var i in initalObj) {        
    if (typeof initalObj[i] === 'object') {
      obj[i] = (initalObj[i].constructor === Array) ? [] : {};            
      arguments.callee(initalObj[i], obj[i]);
    } else {
      obj[i] = initalObj[i];
    }
  }    
  return obj;
}
var str = {};
var obj = { a: {a: "hello", b: 21} };
deepClone(obj, str);
console.log(str.a);

上述代码确实可以实现深拷贝。但是当遇到两个互相引用的对象,会出现死循环的情况。

为了避免相互引用的对象导致死循环的情况,则应该在遍历的时候判断是否相互引用对象,如果是则退出循环。

改进版代码如下:

function deepClone(initalObj, finalObj) {    
  var obj = finalObj || {};    
  for (var i in initalObj) {        
    var prop = initalObj[i];        // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
    if(prop === obj) {            
      continue;
    }        
    if (typeof prop === 'object') {
      obj[i] = (prop.constructor === Array) ? [] : {};            
      arguments.callee(prop, obj[i]);
    } else {
      obj[i] = prop;
    }
  }    
  return obj;
}
var str = {};
var obj = { a: {a: "hello", b: 21} };
deepClone(obj, str);
console.log(str.a);

5、使用Object.create()方法

直接使用var newObj = Object.create(oldObj),可以达到深拷贝的效果。

function deepClone(initalObj, finalObj) {    
  var obj = finalObj || {};    
  for (var i in initalObj) {        
    var prop = initalObj[i];        // 避免相互引用对象导致死循环,如initalObj.a = initalObj的情况
    if(prop === obj) {            
      continue;
    }        
    if (typeof prop === 'object') {
      obj[i] = (prop.constructor === Array) ? [] : Object.create(prop);
    } else {
      obj[i] = prop;
    }
  }    
  return obj;
}

6、jquery

jquery 有提供一个$.extend可以用来做 Deep Copy。

var $ = require('jquery');
var obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
var obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f);
// false

7、lodash

另外一个很热门的函数库lodash,也有提供_.cloneDeep用来做 Deep Copy。

var _ = require('lodash');
var obj1 = {
    a: 1,
    b: { f: { g: 1 } },
    c: [1, 2, 3]
};
var obj2 = _.cloneDeep(obj1);
console.log(obj1.b.f === obj2.b.f);
// false

深入剖析 JavaScript 的深复制

http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/

i2c转串口驱动移植 i2c转串口驱动移植欢迎使用Markdown编辑器新的改变思路与使用方式合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用M 阅读详情

相关推荐

BUCK电路三种工作模式全解析:CCM、BCM、DCM到底怎么选?

本文深入解析BUCK电路的CCM、DCM和BCM三种工作模式,通过对比其电流波形、效率、纹波及环路特性,提供基于计算公式的量化判断方法。文章结合电池供电、高精度模拟等具体应用场景,给出明确的模式选型策略与实战设计指南,帮助工程师根据核心需求做出最优决策。

ee345的博客 486

js对象浅拷贝与深拷贝

一、简介 浅拷贝是拷贝一层,如果数据是基本数据类型,会拷贝其本身,如果除了基本数据类型之外还有一层对象,那么只能拷贝其引用,对象的改变会反应到拷贝对象上。 深拷贝是拷贝多层,每一层的数据都会拷贝出来,对象的改变不会影响拷贝对象。 二、实现 1、实现浅拷贝 1)数组自带的浅拷贝方法:slice()、concat、Array.from()、... 操作符 let...

海阔天空 1344

Ubuntu中snap简单介绍

通过Snap可以安装众多的软件包。需要注意的是,snap是一种全新的软件包管理方式,它类似一个容器拥有一个应用程序所有的文件和库,各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题,使应用程序之间更容易管理。但是由此带来的问题就是它占用更多的磁盘空间 介绍一些常用命令,有点类似docker 1、查看已经通过snap安装的snap包 snap list可以查看 2、可以搜索想要的snap包,例如tomcat snap search tomcat

icanflying的博客 4万+

【jQuery学习】jQuery拷贝对象

5、深拷贝,前面加true,完全克隆,拷贝的是对象而不是地址,修改目标对象不会影响被拷贝对象。想把某个对象拷贝(合并)给另外一个对象使用,此时可以用$.extend()方法。1、deep为true则为深拷贝,默认为false浅拷贝。2、target 要拷贝的目标对象(拷贝到他身上)拷贝给目标对象,修改目标对象会影响被拷贝对象。被拷贝对象里面的复杂数据类型中的地址。2、释放jQuery对$的控制。3、object1 被拷贝的。1、将$符号换为jQuery。jQuery多库共存。

qq_53582888的博客 904

Dify学习笔记-知识库(六)

Dify学习笔记-知识库

大数据知识梳理 2万+

【渗透工具】内网多级代理工具Venom详细使用教程

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

TT小子的博客 3757

超全面的C++知识点概括

C++是对C的补充和扩充,C是C++的一个子集 C 面向过程 用函数解决问题 C++ 面向对象 用成员方法解决问题 C++在兼顾了C执行效率高的优点下提高了编程效率 C++之父——本贾尼.斯特劳斯特朗普 C++ 的文件后缀名可以是 .cpp .cxx .c++ .cc .C 编译C++程序 g++ 或 gcc -lstdc++ 1.名字空间 namespace (1)概念 C++对于变量、类型、函数在逻辑上的一个划分,一个名字空间相当于一个作用域 (2)使用 声明定义一个namespace name

Li17_的博客 954

【异常】Claude Code 第三方API 400报错(thinking type should be enabled or disabled)解决方案

摘要: Claude Code接入第三方API端点时出现400参数错误,主要因新版默认启用的Adaptive Thinking功能与旧版接口参数格式不兼容(需thinking: {type: "adaptive"},但第三方仅支持布尔值)。解决方案为修改本地settings.json配置文件,添加"CLAUDE_CODE_DISABLE_ADAPTIVE_THINKING": "1"环境变量并重启客户端,即可恢复思考模式功能。Adaptive Th

奶爸的编程之路,也就一周冷个三天 1万+

Java基础篇--拷贝

Java拷贝的概念 ***:拷贝有什么作用,日常哪些场合需要用到拷贝? 对象拷贝 ***:实现对象拷贝的三种方式 ***:cloneable接口有什么作用,是否可以不实现该接口? ***:浅拷贝和深拷贝是什么?有什么区别? ***:如何实现深拷贝? ***:使用工具类BeanUtils(org.apache.commons.beanutils)实现拷贝

i18n486的博客 481

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1329

《网络安全自学教程》- 防火墙原理分析与Windows防火墙使用配置

防火墙分类及原理,Windows开启防火墙,Windows防火墙添加策略,

wangyuxiang946的博客 1万+

931-938 jQuery其他方法 (jQuery 对象拷贝,jQuery 多库共存,jQuery 插件)

jQuery 对象拷贝,jQuery 多库共存,jQuery 插件

weixin_51249285的博客 2479

OCR文字识别基础

ocr文字识别

m0_47405013的博客 1755

js 浅拷贝直接赋值_深入剖析javaScript中的深拷贝和浅拷贝

在面试时经常会碰到面试官问:什么是深拷贝和浅拷贝,请举例说明?如何区分深拷贝与浅拷贝,简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝;我们先看两个简单的案例://案例1 var a1 = 1, a2= a1;console.log(a1) //1console.log(a2) //1a2 = 2; //修改 a2consol...

weixin_36087357的博客 186

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

前端面试 | 浅拷贝和深拷贝(基于引用类型)

总结:WeakMap 适合存储那些仅当对象存在时才有意义的数据,比如临时缓存、私有属性等场景,可以避免内存泄漏。而 Map 则适用于需要遍历、需要长期保留数据的场景。深拷贝:慢,开销大,需要遍历所有节点。直接赋值不可行,我们需要一个新对象。手写deepClone:思路分析。现代web api的推荐选择。

2301_80428853的博客 776

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入学习JS — 赋值、浅拷贝和深拷贝

目录1、数据类型1.1 数据类型分类1.2 对象分类2、赋值 1、数据类型 1.1 数据类型分类 ECMAScript中的可以分为两大类: 1、基本数据类型:名值存储在栈内存中,包括:Number、String、Boolean、Null、 Undefined。 2、引用数据类型:名存在栈内存中,值存在于堆内存中,但是栈内存会提供一个引用的地址指向堆内存中的值,包括:Object(数组Array和函数function都属于Object)。 深拷贝和浅拷贝的概率只存在于引用类型中,因为基本数据类型会直接把值拷贝

小绵杨 662

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

js深拷贝和浅拷贝

手写深拷贝-深度遍历 深拷贝: 深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。指复制后的新对象重新指向一个新的内存地址,两个对象改变互不影响。...

Vanessa_Li的博客 1369

深入剖析javaScript中的深拷贝和浅拷贝

深入剖析javaScript中的深拷贝和浅拷贝 在面试时经常会碰到面试官问:什么是深拷贝和浅拷贝,请举例说明?如何区分深拷贝与浅拷贝,简单来说,假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,如果B没变,那就是深拷贝;我们先看两个简单的案例: //案例1 var a1 = 1, a2= a1; console.log(a1) //1 console.log(a2) //1 a2 = 2; //修改a2 console.log(a1) //1 console.log(a2)

wjindu666的博客 247

如何实现数组的浅拷贝和深拷贝

1.    背景介绍javascript分原始类型与引用类型。Array是引用类型,直接用“=”号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。这种方式的实现属于浅拷贝。深拷贝是开辟新的储存空间,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性。2.    知识剖析一维数组深拷贝slice和concat方法1.  slice()slic...

cjwjyooo的博客 1万+

【javaScript】剖析深拷贝与浅拷贝以及实现深拷贝的几种方法

111

Umbrella_Um的博客 287

《前端面试题:JavaScript深拷贝与浅拷贝》

本文将深入剖析JavaScript中的拷贝机制,帮助你彻底掌握这一核心概念。

前端码农的博客 797

【前端】JavaScript 引用变量赋值行为与共享引用的深度剖析

这次问题的探讨和解决过程让我们对 JavaScript 的引用类型有了更深刻的理解。我们了解到: 引用类型的赋值是通过引用进行的,因此在处理对象和数组时,必须特别小心共享引用的问题,避免多个变量指向同一个内存位置而导致数据混淆。 在循环中处理数组时,重置数组或者进行深拷贝是确保数据干净的有效手段,这可以避免残留数据对下一次迭代的影响。 调试器的实时监控可能会引发一些困惑,因为它显示的是当前引用指向的内容,而不是每一轮循环中的静态快照。这也让我们理解了在调试时关注代码执行流程的重要性 2024.11.21-✍

禅宗里有一个词叫做“因缘和合”。 所谓因缘,是指事件要发生所必须的条件。因缘和合就是当你聚集了这件事的一切条件,它就会自然而然的发生。“它就会自然而然的发生”,这种朴素而坚定的价值观让我们感到无比安心,安心到可以不用有任何担心焦虑。 1147

JavaScript基础知识点(四):深拷贝、浅拷贝与原型链讲解

在 JavaScript 中,深浅拷贝是针对对象(引用)类型(如对象、数组、函数等)的复制行为,核心区别在于是否会复制对象内部的嵌套引用类型数据。(注意这段话)浅拷贝(Shallow Copy)只复制对象的第一层属性,如果属性值是引用类型(如对象、数组),则只复制引用地址,而不复制实际的数据深拷贝(Deep Copy)完全复制整个对象,包括所有嵌套的对象和数组,创建一个完全独立的副本概念本质作用关系原型单个对象(prototype存储实例共享的属性和方法原型是原型链上的一个节点原型链。

wtyv3164的博客 707

js 浅拷贝直接赋值_针对js深拷贝浅拷贝的学习理解

深拷贝这个问题一直存在是知道的概念,但是不理解,最近看俩篇文章解释,备注下来,以备后续遗忘的时候方便再次回忆理解现在我们带着问题来学习!一:什么是堆栈? 我们都知道:在计算机领域中,堆栈是两种数据结构,它们只能在一端(称为栈顶(top))对数据项进行插入和删除。堆:队列优先,先进先出;由操作系统自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 栈:先进后出;动态分...

weixin_39559071的博客 83

js深拷贝与浅拷贝

前言 经常会在一些网站或博客看到“深克隆”,“浅克隆”这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝。 浅拷贝 我们先以一个例子来说明js浅拷贝: var n = {a: 1, b: 2} var m = n m.a = 12 console.log(n.a) // ? 上面显然n.a的值会变为 12,这就是js浅拷贝。浅拷贝只是拷贝的指向对象的指针,本质...

ii窝窝头的博客 149

js深拷贝和浅拷贝学习

初级前端面试,应该经常被问到JS深拷贝和浅拷贝。在开发过程中也会经常遇到S深拷贝和浅拷贝问题。下面我们简单剖析一下,深拷贝和浅拷贝的区别。这里涉及到栈堆,基本数据类型与引用数据类型,不在过多赘述了,这链接里面有关数据类型的简单讲述。 浅拷贝:例如 有一个对象 A,此时 对象 B 等于 A, A 对象新增属性或者修改属性值,此时B也会被响应的修改,B被A对象影响,反之B修改,A也会被修改,相互影响。...

qq_34648151的博客 232
上一篇: vue中实现简单轮播效果
下一篇: vue,请求获取图片code,img中产生两次src获取资源问题
github_39598787
博客等级 码龄9年 11粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值