jquery 深拷贝
很多同学在进行编程学习时缺乏系统学习的资料。本页面基于jquery 深拷贝内容,从基础理论到综合实战,通过实用的知识类文章,标准的编程教程,丰富的视频课程,为您在jquery 深拷贝相关知识领域提供全面立体的资料补充。同时还包含 j2ee是什么、jar格式、java 的知识内容,欢迎查阅!
jquery 深拷贝相关知识
-
浅拷贝与深拷贝一、数据类型 数据分为基本数据类型(String, Number, boolean, Null, Undefined,Symbol)和对象数据类型。 基本数据类型的特点:直接存储在栈(stack)中的数据 对象数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里 二、浅拷贝与深拷贝 深拷贝和浅拷贝是只针对Object和Array这样的对象数据类型的。 深拷贝和浅拷贝的示意图大致如下: 浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对
-
深入浅出的“深拷贝与浅拷贝”深入浅出的“深拷贝与浅拷贝”js中的浅拷贝与深拷贝,只是针对复杂数据类型(object, Array)的复制问题。浅拷贝和深拷贝都可以实现在已有对象上再生出一份的作用。但是对象的实例是存储在堆内存中然后通过一个引用值只操作对象,由此拷贝的时候存在两种情况:拷贝引用和拷贝实例,也就是咱们今天要讨论的浅拷贝和深拷贝。浅拷贝 : 浅拷贝是拷贝引用,拷贝后的引用都是指向同一个对象实例,彼此之间操作都会有影响深拷贝 :在堆中重新分配内存,并且把源对象所有属性都进行进行新建拷贝,以保证深拷贝的对象的引用图不包含任何原对象上的对象引用图上的任何对象,拷贝后的对象原对象完全隔离互不影响。浅拷贝浅拷贝分两种情况,拷贝直接拷贝源对象的引用和源对象拷贝实例,但其属性拷贝引用拷贝原的引用这是最简单的浅拷贝。例:let a = {c:1}; let b = a; console.log(a === b)&
-
javascript之浅拷贝与深拷贝浅拷贝:对指针的拷贝,拷贝后两个指针指向同一个内存空间,改变一个另一个也会改变。深拷贝对指针进行拷贝,而且对指针指向的内容进行拷贝,经深拷贝后的指针是指向两个不同地址的指针,改变值互不影响。如下图所示:浅拷贝方式:数组方法1.赋值 arrayCopy = array;方法2. ES6的解构赋值 [...array]方法3. lodash的_.clone(array);对象方法1.赋值 objectCopy = object;方法2. ES6的解构赋值{...object}方法3. lodash的_.clone(object);深拷贝方式:数组方法1.slice()和concat()方法----只适用于没有引用对象的一维数组方法2. JSON.parse(JSON.stringify(array))方法3. array.map(), array.forEach(),array.fliter()等...方法4. lodash的_.cloneDeep(array);对象方法1. JSON.pa
-
关于浅拷贝与深拷贝何为深拷贝,浅拷贝浅拷贝:只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存,拷贝了基本类型的数据,而引用类型数据,复制后也会发生引用,我们把这种拷贝叫做浅拷贝举个栗子var obj1 = {a:10, b:20, c:30};var obj2 = obj1; obj2.b = 50;console.log(obj1); // {a:10, b:50, c:30}console.log(obj2); // {a:10, b:50, c:30}改变了obj2的b,obj1内的值也改变了,这就是浅拷贝深拷贝:深拷贝会另外创造一
jquery 深拷贝相关课程
jquery 深拷贝相关教程
- 3.1 深拷贝 可以配合 JSON 的两个方法,对对象进行深拷贝。var obj = {prop: 'value'};var newObj = JSON.parse(JSON.stringify(obj));newObj.prop = 'new value';console.log(obj);console.log(newObj);根据结果可以看到新的对象修改,没有影响到原对象,两者之间不存在引用关系。
- 4. 案例:深拷贝数组 使用 flat() 方法有个很好用的场景,就是深拷贝数组。我们知道 flat() 拍平后的数组不会影响源数组,那么是不是我们可以传入参数 0 让其不做扁平化操作呢?答案是可以的:var arr1 = [1, 2, [3, 4, [5, 6]]];var arr2 = arr1.flat(0);arr2.push(100)console.log(arr1) // [1, 2, [3, 4, [5, 6]]]console.log(arr2) // [1, 2, [3, 4, [5, 6]], 100]上面的代码中我们传入了 0 作为数组扁平化的深度,也就是不处理,然后给得到的 arr2 数组添加元素,最后打印两个数组,可以看到 arr1 没有 100,这样就达到了使用 flat() 来进行数值的深拷贝。
- 3. 浅拷贝 Object.assign() 的拷贝属于浅拷贝,也就是说它只拷贝对下的第一层的属性值。如果这个值是一个对象类型,那么 Object.assign() 不会对该对象进行深拷贝,也就是说,拷贝后的对象下的这个对象类型是源对象和拷贝后的对象共有的,无论谁(源对象或拷贝后对象)对这个对象下的值进行修改,另一个对象(源对象或拷贝后对象)也会共享这个改变。看下面的例子更清晰的表达:var target = {};var source = {a: 1, b: {c: 2, d: 3}};Object.assign(target, source);target.a = 5;target.b.c = 9;console.log(target) // {a: 5, b: {c: 9, d: 3}}console.log(source) // {a: 1, b: {c: 9, d: 3}}上面的代码中,源对象 source 是个两层的字面量对象,b 也是一个对象。使用 Object.assign() 拷贝给目标对象 target,拷贝后对 target 对象下的值进行修改,然后打印目标对象和源对象。从打印的结果可以看出,对 target 第一层的 a 进行修改时,源对象是不会改变。但是对 target 下的 b 对象下的值进行修改时,因为 b 也是一个对象,所以源对象中的值也被修改了。到这里可以看出,Object.assign() 没有对 b 进行拷贝。如果需要深拷贝则需要,需要递归地使用去 Object.assign() 来拷贝对象。
- 2.2 字面量对象拷贝 上面说到了 ES5 和 ES6 数组拷贝的一个对比,那么针对字面量对象的拷贝二者又是怎么来实现的呢?ES5 中针对字面量对象的拷贝方式比较少,没有数组提供的类似的方法可以使用,只能使用循环,但是还可以使用 JSON.stringify 和 JSON.parse 来实现,但是这个方法存在一些缺陷。 下面看 ES5 中字面量的拷贝实例:let obj = {a: 1, b: 2};let copy1 = {};for(let key in obj) { copy1[key] = obj[key] }let copy2 = JSON.parse(JSON.stringify(obj))上面的两种方法给出了 ES5 拷贝字面量对象的方法,比较麻烦,也容易出错。ES6 给出了它的答案:let obj = {a: 1, b: 2};let copy = {...obj};使用展开语法对 obj 进行展开,完美地实现了拷贝过程。Tips: 这里有必要说明一下,以上的方法都是浅拷贝(只拷贝数组和对象的第一层结构)的过程,对于数组和对象第一层以后的内容,如果是引用类型的存储方式,则不会进行拷贝操作,也就是不会进行深拷贝。
- 2.1 数组拷贝 在 ES5 经常会遇到数组和对象的浅拷贝,我们都知道数组和对象都是引用类型,所以不能像字符串那样直接赋值,在 ES5 中数组和对象的拷贝都是通过循环来实现的,下面我们来看几个例子:var arr1 = [1, 2, 3];var arr2 = [];arr1.forEach(function(value){ arr2.push(value);}) console.log(arr2); // [1, 2, 3]上面的代码是把 arr1 数组中的项拷贝到 arr2 中去,还可以使用数组提供的 concat 和 slice 方法来实现。var arr1 = [1, 2, 3];var arr2 = [].concat(arr1);var arr3 = arr1.slice(0);arr1.push(4)console.log(arr1); //[1, 2, 3, 4]console.log(arr2); //[1, 2, 3]console.log(arr3); //[1, 2, 3]在拷贝完后,对 arr1 数组添加元素,可以看到 arr2 和 arr3 没有发生变化,说明它们不是一个引用地址。这是 ES5 所提供的拷贝方式,那么 ES6 是如何简化的呢?var arr1 = [1, 2, 3]; var arr2 = [...arr1];arr1.push(4)console.log(arr1); //[1, 2, 3, 4]console.log(arr2); //[1, 2, 3]使用 ... 展开语法可以实现与上面 ES5 实现的相同效果,而且比较简洁地表达了把 arr1 中的每一项展开放入 arr2 中。
- 5. 拷贝异常时会被打断 在拷贝时如果发生异常,则拷贝会被终止,并报错,前面已经被拷贝的不会被影响可以继续使用,但后面没有被拷贝的则不能被使用。var target = Object.defineProperty({}, "a", { value: 1, writable: false});Object.assign(target, {b: 2}, {a: 3}, {c: 4});// Uncaught TypeError: Cannot assign to read only property 'a' of object 'console.log(target.b); // 2console.log(target.c); // undefined上面的代码中,定义了目标对象 target 上的属性 a 是只读的,也就是不能不被修改,在合并代码时,源对象上有 a,则报了 a 是对象上的只读属性不能被 assign 操作。从后面的打印结果可以看出,b 已经被拷贝到目标对象上了可以正常使用,但由于拷贝中发生异常,最后一个对象没有被拷贝,所以 c 的值是 undefined。
jquery 深拷贝相关搜索
-
j2ee
j2ee是什么
jar格式
java
java api
java applet
java c
java jdk
java list
java map
java script
java se
java socket
java swing
java switch
java web
java xml
java 程序设计
java 多线程
java 环境变量