ZKX's LAB

js引用类型前拷贝

2020-07-17知识17

js深拷贝和浅拷贝的区别 1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。2.深拷贝(复杂):复制变量值,对于非基本类型的变量,则递归至基本类型变量后,再复制。一、数组的深浅拷贝在使用JavaScript对数组进行操作的时候,我们经常需要将数组进行备份,事实证明如果只是简单的将它赋予其他变量,那么我们只要更改其中的任何一个,然后其他的也会跟着改变,这就导致了问题的发生。var arr=[\"One\",\"Two\",\"Three\"];var arrto=arr;arrto[1]=\"test;document.writeln(\"数组的原始值:\"+arr+\"\");Export:数组的原始值:One,test,Three document.writeln(\"数组的新值:\"+arrto+\"\");Export:数组的新值:One,test,Three像上面的这种直接赋值的方式就是浅拷贝,很多时候,这样并不是我们想要得到的结果,其实我们想要的是arr的值不变,不是吗?方法一:js的slice函数var arr=[\"One\",\"Two\",\"Three\"];var arrtoo=arr.slice(0);arrtoo[1]=\"set Map;document.writeln(\"数组的原始值:\"+arr+\"\");Export:数组的原始值:One,Two,Three document.writeln(\"数组的新值:\"+arrtoo+\"\");Export:数组的新值:One,set Map,Three方法二:js的concat方法var javascript中的深拷贝和浅拷贝? 我想知道深拷贝和浅拷贝的意思!呃,拷贝 和 克隆是一个意思吧?我搜了很多资料,不知道这样理解是否正确…JS面试: 基本数据类型与引用类型间的使用区别 JS面试:基本数据类型与引用类型间的使用区别,因为JavaScrit变量是松散类型,这就决定了它只是在特定时间用于保存特定值得一个名字而已,所以在运行期间对基本数据类型和js基本数据类型和引用类型有哪些 JS基本数据类型的变量存放的是基本类型数据的实际值;而引用数据类型的变量保存对它的引用,即指针。JS基本数据类型:null undefined number booleanstring比较特殊引用数据类型:function object arrayvar a=11;var b=1;b=12;console.log(a);11 a的值不会随b值得改变而改变var a=[1,2,3];var b=a;a[0]=2;console.log(b[0])/2,b的值随着a的值改变而改,因为他们指向同一个内存地址var a=[1,2,3];var b=a;b=[11,12,13];b指向了另一个内存地址,与a断开关联a[0]=2;console.log(b[0])/11,b的值不随a的值改变而改变比如说 var a=1;1是基本数据类型,因此变量a存放的就是1这个值var b=[1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回js中实现深拷贝有哪些方式? 首先需要搞清楚为什么需要做深拷贝?那是因为引用类型在内存中共享给定的值,如果两个变量同时指向某一个引用类型,那么它们在内存中实际上是共享同一个值的,对其中一个变量对象的属性进行修改就会影响另外一个,所以为了不互相影响双方就需要完全复制一份内容即深拷贝!在开发中,我们经常遇到的引用类型就是对象和数组,那么我们来看看对他们进行拷贝有哪些方式?1、手写深拷贝对对象进行拷贝对对象进行拷贝很简单,其实就是扫描source上的K-V,然后一一赋值给另外一个空对象对数组进行拷贝对数组进行拷贝就更简单了,利用数组原生api(我个人常用concat)返回一个新数组,或者利用es6的扩展运算符。使用遍历对象的方式也同样可以(数组也是对象),那么key就是数组的下标。综合一下就多了一步递归,因为要考虑多层级对象和数组的情况!2、zepto实现(jquery手机端版本)deep标识是否需要进行深拷贝target是目标对象剩下的参数都是source,然后用forEach进行遍历,extend的逻辑就和我们自己写的差不多了3、underscore实现思路一样,但是只能做浅拷贝4、lodash实现lodash考虑的比较多,几乎对每种情况都做了特定的处理,建议当作字典查阅!5、序列化实现先把js中包含引用类型值的原型属性会被所有实例所共享。? 我能理解这句话,但是我想知道为什么会这样?求大神解答 cqcpcqp 2 人赞同了该回答 指的是如下情况吧 function Animal(){ this.wife=['gakki']} function Cat(){ } Cat.js基本数据类型和引用类型有哪些 JS基本数据类型的变量存放的是基本类型数据的实际值;而引用数据类型的变量保存对它的引用,即指针。JS基本数据类型:null undefined number booleanstring比较特殊引用数据类型:function object arrayvar a=11;var b=1;b=12;console.log(a);11 a的值不会随b值得改变而改变var a=[1,2,3];var b=a;a[0]=2;console.log(b[0])/2,b的值随着a的值改变而改,因为他们指向同一个内存地址var a=[1,2,3];var b=a;b=[11,12,13];b指向了另一个内存地址,与a断开关联a[0]=2;console.log(b[0])/11,b的值不随a的值改变而改变比如说 var a=1;1是基本数据类型,因此变量a存放的就是1这个值var b=[1,2,3],[1,2,3]是引用数据类型,[1,2,3]是放在内存中的,而变量b存放的是[1,2,3]的地址,而不是[1,2,3]这个值当使用b这个变量时,js解释器会通过b存放的内存地址,找到内存中的相应地址,将其中的值取出来返回js中的值类型和引用类型的区别 举实例,JavaScript值类型和引用类型有哪些(1)值类型:数值、布尔值、null、undefined。(2)引用类型:对象、数组、函数。js中包含引用类型值的原型属性会被所有实例所共享。? 我能理解这句话,但是我想知道为什么会这样?求大神解答 cqcpcqp 2 人赞同了该回答 指的是如下情况吧 function Animal(){ this.wife=['gakki']} function Cat(){ } Cat.我想问哈js中的字符串的复制和引用是传值还是传地址?? 这里其实就是深拷贝和浅拷贝的问题,你上边代码只是浅拷贝,当2种情况1:涉及对象的赋值 obj=obj12:涉及数组赋值 ary=ary1那么他们是传地址的,如果改动其中一个,如改动obj.name,那么obj1.name也是会发生变化的,自己验证一下。你上边的情况不涉及对象的赋值,而仅仅是字符串的简单复制,用浅拷贝就行了,当你上边变动一下,var a={name:'yy',age:26};b=a;var b=new Object();那么就要考虑深拷贝了 a=b.clone()/Object.prototype.clone()重写不然改动a.name,b.name也发生变化原理我解释一下:涉及对象和数组,b=a;那么b 放弃了new Object的地址,替换成指向a创建的{name:'yy',age:26}存放的地址,而 b.name=a.name b和a的地址不一样,所以a.name改变不影响b.name正确与否,自己写个例子验证

#js#引用类型#js代码#数组#var

qrcode
访问手机版