使用递归进行深拷贝

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. Swift学习笔记:类和结构

    一.类和结构的异同 类和结构有一些相似的地方.它们都能够: 1. 定义一些能够赋值的属性: 2. 定义具有功能性的方法 3. 定义下标.使用下标语法 4. 定义初始化方法来设置初始状态 5. 在原实现 ...

  2. web - 块元素和内嵌元素的特征

    块: 1.独占一行 2.支持所有的样式 3.不设置宽度的时候,宽度撑满整行 常用的快标签有: div,section,header,nav,footer,article,aside,ul,ol,li, ...

  3. Memcached基础

    1.实例化 MemcachedClient client = new XMemcachedClient(); public XMemcachedClient() public XMemcachedCl ...

  4. Oracle学习之常见问题处理

    转自:http://blog.csdn.net/liusong0605/article/details/16349121 安装完oracle并启动服务后,通过sqlPlus无法登录,出现如下错误: s ...

  5. Struts学习之文件上传

    * 单文件上传:        * 在动作类action中声明相关属性:            * 在动作类action中,要声明与页面中表单name属性同名的属性,同名的属性的类型是File类型:  ...

  6. WebApi服务

    WCF 它利用TCP.HTTP.MSMQ等传输协议构建“契约先行”的服务.WCF最初为基于SOAP的服务而设计[xml],繁琐.冗余.慢.沉重 WebApi 基于http协议,轻量级的,支持URL路由 ...

  7. 关于eclipse(64位)下aptana插件安装报错问题解决

    最近一直没有写过js,换了新电脑以后,eclipse下的aptana插件也没有装过,这几天要写js想重新把aptana装上,但是不知怎的,link方式.在线安装方式还有离线包下载下来利用eclipse ...

  8. codeforces 632D. Longest Subsequence 筛法

    题目链接 记录小于等于m的数出现的次数, 然后从后往前筛, 具体看代码. #include <iostream> #include <vector> #include < ...

  9. 上星期IOS的一个面试题。

    美丽说面试题 1,IOS是怎样进行内存管理的,什么是ARC. 2,声明Property时,assign,nonatomic,readonly,retain,copy(各什么意思,括号里没打印出来,我猜 ...

  10. 解决phpmyadmin-1800秒超时链接失效问题

    在phpmyadmin的配置文件里 \usr\share\phpMyAdmin\libraries\config.default.php 修改 $cfg[‘LoginCookieValidity’] ...