使用递归进行深拷贝

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. asp.net DropDownList实现ToolTip功能

    在绑定DropDownList控件时,可能出现绑定显示的文本过长以至于超过控件长度的内容看不到,这时候就需要使用ToolTip完成其功能,即鼠标放到相应选项后就可显示其完成内容. 首先,在页面引入jQ ...

  2. winfrom运用webservice上传文件到服务器

    winfrom做文件上传的功能显然没有BS的简单,本实例是运用了webservice获取二进制流转换的字符串.然后,解析字符串,把流文件再转成pdf. webservice 里面的代码为下: [Web ...

  3. 如何在其他类中实现继承自CFormView类的对象

    今天项目开发中,我们创建了一个对话框资源,并创建了一个派生自CFormView的类(假设为CMyClassDlg)来管理它. CMyClassDlg.h #pragma once // CMyClas ...

  4. JS 人民币大写

    /***** HongShijin** Me@HongShijin.com** 2014-10-15 9:13:00.00000** text/javascript***/ (function ($) ...

  5. HDU1159-Common Subsequence

    描述: A subsequence of a given sequence is the given sequence with some elements (possible none) left ...

  6. Android Studio 工程.GitIgnore应该忽略的文件

    # Built application files *.apk *.ap_ # Files for the Dalvik VM *.dex # Java class files *.class # G ...

  7. APM代码学习笔记1

    libraries目录 传感器 AP_InertialSensor 惯性导航传感器 就是陀螺仪加速计 AP_Baro 气压计 居然支持BMP085 在我印象中APM一直用高端的MS5611 AP_Co ...

  8. vcredist作用

    一.vcredist作用: vcredist_x86.exe是微软公司Visual C++的32位运行时库,包含了一些Visual C++的库函数. vcredist_x64.exe是微软公司Visu ...

  9. DOCTYPE声明的几种类型

    DOCTYPE声明的几种类型 DOCTYPE 声明决定着浏览器怎么去解析和渲染当前页面,所以对于页面来说是很重要的. HTML5时代,统一用 <!DOCTYPE html> 这样简单的方式 ...

  10. Mysql 忘密码 + Phpadmin 修改密码无法登陆

    mysql有时候忘记密码了怎么办?我给出案例和说明!一下就解决了! Windows下的实际操作如下 1.关闭正在运行的MySQL. 2.打开DOS窗口,转到mysql\bin目录. 3.输入mysql ...