深度克隆---js对象引用
首先,我们要知道,javascript中除了基本类型(number,string,boolean,null,undefined)之外就是引用类型了,也可以说就是js对象了。
引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
在探讨到深度克隆之前,我们先来看一下下面的例子:
example01:
var a = [1,2,3];
var b = a; // a b共用一个引用
b.push(4);
alert(b); // [1,2,3,4]
alert(a); // [1,2,3,4]
example02:
var a = [1,2,3];
var b = a;
b = [1,2,3,4]; // b新开了一个引用
alert(b); // [1,2,3,4]
alert(a); // [1,2,3]
example03:
var obj = {
a: 10
};
var obj2 = obj;
obj2.a = 20;
alert(obj.a); //
example04:
var obj = {
a: 10
};
function copy(obj){ // 浅拷贝, 只拷贝的一层
var newObj = {};
for(var attr in obj){
newObj[attr] = obj[attr];
}
return newObj;
}
var obj2 = copy(obj);
obj2.a = 20;
alert(obj.a); //
example05:
var obj = {
a: {
b: 10
}
}
function copy(obj){ //浅拷贝, 只拷贝了一层
var newObj = {};
for(var attr in obj){
newObj[attr] = obj[attr];
}
return newObj;
}
var obj2 = copy(obj);
obj2.a.b = 20;
alert(obj.a.b); //
看完上面几个例子之后,想必对js对象引用有了一定的认识。接下来,我们来看js里面另外一个重要的应用---递归。
递归定义可以分为两点:(1).函数调用函数自身,执行递的动作;(2).最后一次判断一个终止条件,可以执行归的动作。
example06:
//求nX(n-1)X(n-2)X...X2X1
function test(n){
if(n == 1){
return 1;
}
return n*test(n-1);
}
alert(test(5)); //
所以,深拷贝也用到了递归。
对象的子对象也是引用,所以遍历赋值的时候要判断,子元素是否是对象,如果子元素是对象,则继续对子元素进行遍历赋值。
example07:
//深拷贝
function deepClone(obj){
var newObj = {};
if(typeof obj != 'object'){
return obj;
}
for(var attr in obj){
newObj[attr] = deepClone(obj[attr]);
}
return newObj;
}
var obj = {
a: {
b: 10
}
};
var obj2 = deepClone(obj);
obj2.a.b = 20;
alert(obj.a.b); //
深度克隆---js对象引用的更多相关文章
- js对象的深度克隆
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JS的深度克隆,利用构造函数原型深度克隆
我爱撸码,撸码使我感到快乐!大家好,我是Counter.今天来写写,JS中的深度克隆,这个在笔面试中,考的还是比较多的,主要是对象与数组的赋值,如果直接赋值的话,那么得到的是对象或者数组在堆里的地址, ...
- js深度克隆对象
js深度克隆对象 js深度克隆对象简单的记录一下,如下代码: var obj = { typeOf: function(obj) { const toString = Object.prototype ...
- js实现数组、对象深度克隆的两种办法
1.深度克隆的原理 JS中的深度克隆,指的是原对象改变了,克隆出来的新对象也不会改变,原对象与新对象是完全独立的关系. 实现深度克隆的原理得从对象是一种引用类型说起 众所周知,对象是一种引用类型,对象 ...
- js之深度克隆、简易克隆
一.js中的对象 谈到对象的克隆,必定要说一下对象的概念. js中的数据类型分为两大类:原始类型和对象类型. (1)原始类型包括:数值.字符串.布尔值.null.undefined(后两个是特殊的原始 ...
- JS对象深度克隆
首先看一个例子: var student = { name:"yxz", age:25 } var newStudent = student; newStudent.sex = & ...
- js对象简单、深度克隆(复制)
javascript的一切实例都是对象,只是对象之间稍有不同,分为原始类型和合成类型.原始类型对象指的是字符串(String).数值(Number).布尔值(Boolean),合成类型对象指的是数组( ...
- js浅度克隆/深度克隆
首先弄明白几个概念: 一. 具体数据类型分为两种: 1.原始数据类型 2.引用数据类型 原始数据类型存储的是对象的实际地址,包括: number.string.boolean.还有两个特殊的nul ...
- js里的深度克隆
ES6 数组克隆 let arr = [1,2,3,4,5]; let arr1 = [...a]; arr1 = ["a","b","c" ...
随机推荐
- hdoj 2049 错排
代码: #include <stdio.h> int main(){ int n,a,b,i,j; __int64 s[22],h[22]; s[1]=0; s[2]=1; s[3]=2; ...
- X-Plane飞行模拟器购买安装
要玩起X-Plane第一个步骤当然是购买了,要购买其实非常简单,只需要一张能够支持MasterCard或者其他外币结算的信用卡,在http://www.x-plane.com/官网上购买即可,比逛淘宝 ...
- Web::Scraper 页面提取分析
一组用来提取HTML文档中元素内容的工具集,它能够理解HTML和CSS选择器以及XPath表达式. 语法 use URI; use Web::Scraper; # First, create your ...
- JS判断浏览器是否支持某一个CSS3属性的方法
var div = document.createElement('div'); console.log(div.style.transition); //如果支持的话, 会输出 "&quo ...
- C# 线程间互相通信
C#线程间互相通信主要用到两个类:AutoResetEvent和ManualResetEvent. 一.AutoResetEvent AutoResetEvent 允许线程通过发信号互相通信,线程通过 ...
- IE下空链接失效原因及解决方法
我们把a链接的display设置为block,但如果对该标签设置为position:absolute后,会发现在ie6.ie7下有时点击无效,ie8下有效(ie8标准),使用zoom:1方式也无法解决 ...
- .Net用js实现aspx页面删除TextBox输入框的前后空格
去掉TextBox输入框两头的前后空格:onblur="this.value=this.value.replace(/^\s+|\s+$/g,'');" str为要去除空格的字符串 ...
- Access自动编号的初始值设置及重置编号 转
方法如下: ALTER TABLE tableName ALTER COLUMN Id COUNTER (100, 5) 其中:tableName为要修改的表名,Id为自动编号列,100为初始值,5为 ...
- Html5-Canvas实现简易的抽奖转盘
###Html5实现抽奖转盘效果 1.实现的基本效果 2.主要的内容 html5中canvas标签的使用 jQueryRotate.js旋转插件 3.主要html代码 <body> < ...
- PHPCMS v9 自定义表单添加验证码验证
1. 在 \phpcms\templates\default\formguide\show.html 中添加验证码显示 <input type="text" id=" ...