使用递归进行深拷贝

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. APP应用的发展趋势

    PhoneGap 是什么 PhoneGap 是一个用基于HTML,CSS 和JavaScript 的,创建移动跨平台移动应用程序的快速开发框架.它使开发者能够利用iPhone,Android,Palm ...

  2. C# 想要程序文件移动 而数据保持相对位置

    如果用的数据库是access数据库 可以把数据库文件放到bin\debug下面,引用相对位置就可以了 如果程序中有上载文件,而程序需要使用到该文件,那么我们最好也是引用相对文件,我们只需要在数据表中的 ...

  3. Java String.indexOf() 函数用法小结

    1. indexOf的参数是 String,  startIndex: Number; indexOf的返回值为int, 2. Function indexOf 包含如下几个格式:1). Strng. ...

  4. 成功的背后!(给所有IT人)----转载:来自CSDN第一名博主

    转载:来自CSDN第一名博主:http://blog.csdn.net/phphot/article/details/2187505 放在这里激励你我! 正文: 成功的背后,有着许多不为人知的故事,而 ...

  5. Scala学习之for 循环和 yield 的例子

    for循环中的 yield 会把当前的元素记下来,保存在集合中,循环结束后将返回该集合.Scala中for循环是有返回值的.如果被循环的是Map,返回的就是Map,被循环的是List,返回的就是Lis ...

  6. linux之awk

    相较于sed 常常作用于一整个行的处理,awk 则比较倾向于一行当中分成数个『字段』来处理. 因此,awk 相当的适合处理小型的数据数据处理呢! awk 通常运作的模式是这样的: [root@linu ...

  7. 剑指offer——从尾到头打印链表节点的值

    输入一个链表,从尾到头打印链表每个节点的值. 输入描述:输入为链表的表头 输出描述:输出为需要打印的“新链表”的表头 一.问题分析 初拿到这个题目时,这应该是考察单向链表这一数据结构.单向链表的遍历总 ...

  8. 转载:Ajax及 GET、POST 区别

    转载:Ajax及 GET.POST 区别 收获: xhr.setRequestHeader(), xhr.getResponseHeader() 可以设置和获取请求头/响应头信息; new FormD ...

  9. ssh 如何通过外网访问内网多台服务器

    本帖子未验证: 我看到一个论坛,坛友发的一个问题 http://bbs.51cto.com/thread-934340-1.html 解决方法,我自己开了这个帖子写在这里. 首先你需要一个软件“Sec ...

  10. 类型萃取(type traits)

    1. 类型萃取的作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他.例如:在STL ...