使用递归进行深拷贝

http://lingyu.wang/2014/03/20/js-interview-1/

    Object.prototype.deepClone = function() {
var isArray = function(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
};
var isObj = function(obj) {
return Object.prototype.toString.call(obj) === "[object Object]";
};
var deepClone = Object.prototype.deepClone;
var obj = this.isArray ? [] : {};
for (var prop in this) { if (isObj(this[prop])) {
this[prop].deepClone();
}
obj[prop] = this[prop];
}
return obj;
};

这个代码是有些问题的  关键就在于这个判断 if (isObj(this[prop])) {

运行下面  就发现 rs 也被改了

    var arr = [[1,2,3],4,5,6];
var change = arr[0];
var rs = arr.deepClone();
change[0] = 'change';
console.log(rs);

略微修改一下

    Object.prototype.deepClone = function() {
var isArray = function(obj) {
return Object.prototype.toString.call(obj) === "[object Array]";
};
var isObj = function(obj) {
return Object.prototype.toString.call(obj) === "[object Object]";
};
var deepClone = Object.prototype.deepClone;
var obj = isArray(this) ? [] : {}; // 深拷贝关键点: 对于非简单类型的对象 就是创建一个新对象然后将值一个个的copy过来
//PS 数组的遍历也是同样可以使用 for in 的 只不过for in会把该数组的增加的一些对象也遍历出来 所以需要使用 hasOwnProperty 来判断 这样子都是数组中的元素了
// 本例子中如果不加上 hasOwnProperty 遍历出的数组还有一个 deepClone
for (var prop in this) {
if (this.hasOwnProperty(prop)) {
console.log(prop + '---' + this[prop]);
if (isObj(this[prop]) || isArray(this[prop])) {
obj[prop] = this[prop].deepClone();
}else{
obj[prop] = this[prop];
}
}
}
return obj;
}; var arr = [
[1, 2, 3], 4, 5, 6
];
var rs = arr.deepClone();
var change = arr[0];
change[0] = 'change';
console.log(rs);

转载http://mao.li/javascript/javascript/

    window.onload = function() {
testCons();
Object.prototype.Clone = function() {
var objClone;
if (this.constructor == Object) {
objClone = new this.constructor();
} else {
// objClone=new this.constructor(this.valueOf());
objClone = this.valueOf();//似乎这样也没错?
}
for (var key in this) {
if (objClone[key] != this[key]) {
if (typeof(this[key]) == 'object') {
objClone[key] = this[key].Clone();
} else {
objClone[key] = this[key];
}
}
}
objClone.toString = this.toString;
objClone.valueOf = this.valueOf;
return objClone;
}
var obj1 = {
key1: 1,
key2: {
key21: 21,
key22:"22",
key23:{
key221:221
}
} }
obj2 = obj1.Clone();
console.log(obj2);
console.log(typeof obj2.key2.key21);
}

关于new this.consturctor(this.valueOf());

话说之前还木有见到过这样的写法  感觉这里就是构造函数创建对象

    function testCons() {
var num = 5;
console.log(num.constructor(6)); //
console.log(typeof num.constructor(6)); //number
console.log(num.constructor);//function Number() { [native code] }
console.log(num.constructor==Number);//true n=new num.constructor(6);
console.log(typeof n); //object 你看typeof来判断类型很笼统 注意和不用new的区别 这个和js包装对象有关
console.log(n.constructor);//function Number() { [native code] }
console.log(n.constructor==Object); //false
//因此用constructor来判断类型是最合适不过的 function Person(name) {
this.name = name;
}
p1 = new Person('fgh');
console.log(p1.constructor == Person); //true
p2 = new p1.constructor('bnmn');
console.log(p2.name); //bnmn
//两者一致
console.log(Person);
console.log(p2.constructor);
}

js包装对象

    //js包装对象
var a=Number(5);
console.log(typeof a);//number
console.log(a.constructor);//function Number() { [native code]
var b=new Number(6);
console.log(typeof b);//object
console.log(b.constructor);//function Number() { [native code] } var num=5;
num2=new num.constructor(6);
console.log(num.constructor==Number);//true 所以这里new num.constructor 相当于Number(6)
console.log(num.constructor);//function Number() { [native code] }
console.log(typeof num2); //object

JS 深拷贝的更多相关文章

  1. js 深拷贝和浅拷贝

    js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...

  2. 老生常谈之js深拷贝与浅拷贝

    前言 经常会在一些网站或博客看到"深克隆","浅克隆"这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝. 浅拷贝 我们先以一个例子来说明 ...

  3. 关于JS深拷贝和浅拷贝

    最近在前端开发中遇到一些问题,就是数组中的某个对象或某个对象的值改变之后,在不刷新页面的时候需要重新渲染值时,页面显示的还是原来的数据.比如: data{ A:[{id:1,num:1},{id:2, ...

  4. js深拷贝你还不会吗

    js深拷贝 在讲正题之前我们要先了解数据存储的方式 数据存储方式 在讲之前我们要先知道值类型和引用类型的存储方式. 在JavaScript数据类型中有两种数据类型. 值类型:字符串(String).数 ...

  5. 由js深拷贝引起的对内存空间的一些思考

    数据类型 js常用数据类型分为基本类型和引用类型 基本类型:null.undefined.数值型.字符串型.布尔型 引用类型:数组.对象 内存空间 var a = [1, 2, 3]; var b = ...

  6. 理解JS深拷贝

    前言: JS的拷贝(copy),之所以分为深浅两种形式,是因为JS变量的类型存在premitive(字面量)与reference(引用)两种区别.当然,大多数编程语言都存在这种特性. 众所周知,内存包 ...

  7. js深拷贝与浅拷贝

    1 基础知识:基本类型与引用类型 JS中可以把变量分成两部分,基本类型和引用类型. 基本类型包括:Undefined.Null.Boolean.Number和String: 引用类型值可能由多个值构成 ...

  8. JS深拷贝/深克隆(面试用)

    晒下我的比较浅显的深拷贝,没有考虑原型和循环引用,可以拷贝一些js原生类型,用于面试用. function deepClone(obj){ if(Object.prototype.toString.c ...

  9. js深拷贝、浅拷贝

    浅拷贝: 只针对当前对象的属性进行拷贝,若当前对象的属性是引用类型时,这个不考虑,不进行拷贝.若属性是引用类型,拷贝后引用的是地址,如果进行更改,会影响拷贝的原对象属性. 深拷贝:针对当前对象的数据的 ...

随机推荐

  1. redis持久化与可用性

    redis对于持久化有快照及aof日志文件两种形式. 快照db文件,长处是二进制,大小比aof日志文件小.但会丢失最后一次成功备份时间到down机时间的数据. aof相比而言文件大小就大了点,但相对快 ...

  2. AlarmManager类的应用

    1.AlarmManager,顾名思义,就是“提醒”,是Android中常用的一种系统级别的提示服务,可以实现从指定时间开始,以一个固定的间隔时间执行某项操作,所以常常与广播(Broadcast)连用 ...

  3. OO真经——关于面向对象的哲学体系及科学体系的探讨(下)

    真经第六章——运作 Moving “运动是绝对的——牛顿” 6.1.导言 在前五章中,我们从世界观的这话题开始,逐步引出了抽象.层次.继承和耦合.这些内容,形成了对象论中关于世界的结构体系.      ...

  4. C学习之指针强化

    char *p = (char *)malloc(100); malloc是用于分配内存的函数,它的参数为int型,表示分配多少个字节长度,其返回类型为void*,在这里用char*就是强制转化,指定 ...

  5. WSDL规则解释(转)

    转自:http://www.blogjava.net/baoyaer/articles/116413.html WSDL文档可以分为两部分.顶部分由抽象定义组成,而底部分则由具体描述组成.抽象部分以独 ...

  6. hdu 4454 Stealing a Cake (三分)

    Stealing a Cake Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 同步队列-Queue模块解析

    Queue模块解决了生产者.消费者问题,在多线程编程中进行线程通信的时候尤其有用,Queue类封装了加锁解锁的过程.         在Queue模块中有三种不同的队列类,区别是不同队列取出数据的顺序 ...

  8. yii2.0 控制器方法 视图表单 Form表单处理

    假设我们在ArticleController.php下面的actionForm方法中来处理提交的表单 新建立一个 views/Article/article-form.php文件用来作为输入表单 &l ...

  9. python基础--模块&包

    一.模块 1.模块是程序 任何Python程序都可以作为模块导入. 程序的保存也很重要,如果想把程序保存在C:\python (Windows)目录下,需要告诉解释器在哪里寻找模块了. >> ...

  10. 转: Nodejs 发送HTTP POST请求实例

    项目里面需要用到使用NodeJs来转发HTTP POST请求,把过程记录一下: exports.sendEmail = function (req, res) { res.send(200, req. ...