热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

js赋值给java_JS的赋值与深浅拷贝实例

赋值基本类型:传值,在栈内存中的数据发生数据变化的时候,系统会自动为新的变量分配一个新的之值在栈内存中,两个变量相互独立&#

赋值

基本类型: 传值,在栈内存中的数据发生数据变化的时候,系统会自动为新的变量分配一个新的之值在栈内存中,两个变量相互独立,互不影响的

引用类型: 传址,只改变指针的指向,指向同一个对象,两个变量相互干扰

//基本数据类型赋值

var a = 10;

var b = a;

a++ ;

console.log(a); // 11

console.log(b); // 10

//引用数据类型赋值

let a = { name: '11' }

let b = a

b.name = '22'

console.log(a.name) // 22

console.log(b.name) // 22

浅拷贝

对于基本类型,浅拷贝是对值的复制,拷贝前后对象的基本数据类型互不影响

对于引用类型来说,浅拷贝是对对象地址的复制, 也就是拷贝的结果是两个对象指向同一个地址,所以如果其中一个对象改变了这个地址,就会影响到另一个对象

注意:浅拷贝只复制一层对象的属性

实现浅拷贝方法

方法一:Object.assign

**语法:Object.assign(target, ...sources)   **

ES6中拷贝对象的方法,接受的第一个参数target是拷贝后的对象,剩下的参数是要拷贝的对象sources(可以是多个)

例1:

let target = {};

let source = {a:'11',b:{name:'duoduo'}};

Object.assign(target ,source);

console.log(target); // { a: '11', b: { name: 'duoduo' } }

例2:

let target = {};

let source = {a:'11',b:{name:'duoduo'}};

Object.assign(target ,source);

source.a = '22';

source.b.name = 'nana'

console.log(source); // { a: '22', b: { name: 'nana' } }

console.log(target); // { a: '11', b: { name: 'nana' } }

Object.assign注意事项

只拷贝源对象的自身属性(不拷贝继承属性)

它不会拷贝对象不可枚举的属性

undefined和null无法转成对象,它们不能作为Object.assign参数,但是可以作为源对象

属性名为Symbol 值的属性,可以被Object.assign拷贝。

方法二:Array.prototype.slice

实现原数组的浅拷贝

var a = [ 1, 3, 5, { x: 1 } ];

var b = Array.prototype.slice.call(a);

b[0] = 2;

console.log(a); // [ 1, 3, 5, { x: 1 } ];

console.log(b); // [ 2, 3, 5, { x: 1 } ];

// 从输出结果可以看出,浅拷贝后,数组a[0]并不会随着b[0]改变而改变

// 说明a和b在栈内存中引用地址并不相同。

var a = [ 1, 3, 5, { x: 1 } ];

var b = Array.prototype.slice.call(a);

b[3].x = 2;

console.log(a); // [ 1, 3, 5, { x: 2 } ];

console.log(b); // [ 1, 3, 5, { x: 2 } ];

// 从输出结果可以看出,浅拷贝后,数组中对象的属性会根据修改而改变

// 说明浅拷贝的时候拷贝的已存在对象的对象的属性引用。

方法三:Array.prototype.concat

let array = [{a: 1}, {b: 2}];

let array1 = [{c: 3},{d: 4}];

let array2=array.concat(array1);

array1[0].c=123;

console.log(array2);// [ { a: 1 }, { b: 2 }, { c: 123 }, { d: 4 } ]

console.log(array1);// [ { c: 123 }, { d: 4 } ]

方法四:...扩展运算符

语法:var clOneObj= { ...obj };

var a = [ 1, 3, 5, { x: 1 } ];

var b = {...a};

b[0] = 2;

console.log(a); // [ 1, 3, 5, { x: 1 } ];

console.log(b); // [ 2, 3, 5, { x: 1 } ];

// 从输出结果可以看出,浅拷贝后,数组a[0]并不会随着b[0]改变而改变

// 说明a和b在栈内存中引用地址并不相同。

var a = [ 1, 3, 5, { x: 1 } ];

var b = {...a};

b[3].x = 2;

console.log(a); // [ 1, 3, 5, { x: 2 } ];

console.log(b); // [ 1, 3, 5, { x: 2 } ];

// 从输出结果可以看出,浅拷贝后,数组中对象的属性会根据修改而改变

// 说明浅拷贝的时候拷贝的已存在对象的对象的属性引用。

其他方法:

//浅拷贝实现

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.arr[1] = 5;

obj.arr[1] // = 5

深拷贝

深拷贝开辟一个新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性

注意:深拷贝对对象中的子对象进行递归拷贝,拷贝前后两个对象互不影响

实现方法:

方法一:JSON.parse(JSON.stringify())

JSON.stringify()是前端开发过程中比较常用的深拷贝方式。

原理是把一个对象序列化成为一个JSON字符串,将对象的内容转换成字符串的形式再保存在磁盘上,再用JSON.parse()反序列化将JSON字符串变成一个新的对象

let arr = [1, 2, {name: ' duoduo'}];

let newarr = JSON.parse(JSON.stringify(arr));

newarr[2].name = 'nana';

console.log(newarr); // [ 1, 2, { username: 'nana' } ]

console.log(arr); // [ 1, 2, { username: 'duoduo' } ]

JSON.stringify()实现深拷贝注意点

拷贝的对象的值中如果有函数,undefined,symbol则经过JSON.stringify()序列化后的JSON字符串中这个键值对会消失

无法拷贝不可枚举的属性,无法拷贝对象的原型链

拷贝Date引用类型会变成字符串

拷贝RegExp引用类型会变成空对象

对象中含有NaN、Infinity和-Infinity,则序列化的结果会变成null

无法拷贝对象的循环应用(即obj[key] = obj)

方法二:jquery 的 $.extend

var $ = require('jquery');

var obj1 = {

a: 1,

b: { f: { g: 1 } },

c: [1, 2, 3]

};

var obj2 = $.extend(true, {}, obj1);

赋值、深拷贝、浅拷贝

浅拷贝和深拷贝****区别

浅拷贝只复制一层对象的属性,而深拷贝则递归复制了所有层级

9fab91b803ee23feab109adef1e48ed6.png

**



推荐阅读
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 重要知识点有:函数参数默许值、盈余参数、扩大运算符、new.target属性、块级函数、箭头函数以及尾挪用优化《深切明白ES6》笔记目次函数的默许参数在ES5中,我们给函数传参数, ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文介绍了如何使用 Node.js 和 Express(4.x 及以上版本)构建高效的文件上传功能。通过引入 `multer` 中间件,可以轻松实现文件上传。首先,需要通过 `npm install multer` 安装该中间件。接着,在 Express 应用中配置 `multer`,以处理多部分表单数据。本文详细讲解了 `multer` 的基本用法和高级配置,帮助开发者快速搭建稳定可靠的文件上传服务。 ... [详细]
  • 技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统
    技术分享:使用 Flask、AngularJS 和 Jinja2 构建高效前后端交互系统 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 本文全面解析了JavaScript中的DOM操作,并提供了详细的实践指南。DOM节点(Node)通常代表一个标签、文本或HTML属性,每个节点都具有一个nodeType属性,用于标识其类型。文章深入探讨了DOM节点的创建、查询、修改和删除等操作,结合实际案例,帮助读者更好地理解和掌握DOM编程技术。 ... [详细]
  • 在PHP的设计中,预定义了9个超级全局变量、8个魔术变量和13个魔术函数,这些变量和函数无需声明即可在脚本的任意位置使用。这些特性在PHP开发中极为常见,能够显著提升开发效率和代码的灵活性。相比之下,Java并没有类似的内置机制,但通过其他方式如上下文对象和反射机制,也可以实现类似的功能。本文将详细探讨这两种语言中这些特殊变量和函数的使用方法及其应用场景。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • 在稀疏直接法视觉里程计中,通过优化特征点并采用基于光度误差最小化的灰度图像线性插值技术,提高了定位精度。该方法通过对空间点的非齐次和齐次表示进行处理,利用RGB-D传感器获取的3D坐标信息,在两帧图像之间实现精确匹配,有效减少了光度误差,提升了系统的鲁棒性和稳定性。 ... [详细]
  • JavaScript最初并非设计为纯粹的面向对象编程(OOP)语言,因为直到ES5标准中仍未引入类的概念。然而,随着ES6的发布,JavaScript正式引入了类的语法,使得开发者能够更加直观地实现继承机制。本文将深入探讨JavaScript中多样的继承实现方法,包括原型链、寄生组合式继承等技术,并分析它们的优缺点及适用场景。 ... [详细]
  • 下面的代码旨在输出其类文件的完整名称。对于不熟悉类字面量的读者,`Me.class.getName()` 方法会返回类的全称,例如 “com.javapuzzlers.Me”。通过这一机制,可以深入了解 Java 类加载和反射机制的内部工作原理。 ... [详细]
  • 如果应用程序经常播放密集、急促而又短暂的音效(如游戏音效)那么使用MediaPlayer显得有些不太适合了。因为MediaPlayer存在如下缺点:1)延时时间较长,且资源占用率高 ... [详细]
  • 利用 JavaScript 和 Node.js 验证时间的有效性
    本文探讨了如何使用 JavaScript 和 Node.js 验证时间的有效性。通过编写一个 `isTime` 函数,我们可以确保输入的时间格式正确且有效。该函数利用正则表达式匹配时间字符串,检查其是否符合常见的日期时间格式,如 `YYYY-MM-DD` 或 `HH:MM:SS`。此外,我们还介绍了如何处理不同时间格式的转换和验证,以提高代码的健壮性和可靠性。 ... [详细]
  • 本文将深入探讨Java编程语言中顶级类`Object`的源码实现,旨在为Java新手提供进阶指导。`Object`类是所有Java类的基类,了解其内部机制对于提升编程技能至关重要。文章首先介绍了API文档的使用方法,这对于有开发经验的Java程序员来说是不可或缺的工具。通过详细解析`Object`类的关键方法和属性,读者可以更好地理解Java的核心原理和设计思想。此外,文章还提供了实际代码示例,帮助读者在实践中掌握这些知识。 ... [详细]
author-avatar
v敏0敏v_405_961
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有