JS 深拷贝
使用递归进行深拷贝
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 深拷贝的更多相关文章
- js 深拷贝和浅拷贝
js 深拷贝和浅拷贝 先举一下项目中遇到的两个例子: 例子1: var json = $.parseJSON(data.data);//data.data是接口返回的值var a = json.cha ...
- 老生常谈之js深拷贝与浅拷贝
前言 经常会在一些网站或博客看到"深克隆","浅克隆"这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝. 浅拷贝 我们先以一个例子来说明 ...
- 关于JS深拷贝和浅拷贝
最近在前端开发中遇到一些问题,就是数组中的某个对象或某个对象的值改变之后,在不刷新页面的时候需要重新渲染值时,页面显示的还是原来的数据.比如: data{ A:[{id:1,num:1},{id:2, ...
- js深拷贝你还不会吗
js深拷贝 在讲正题之前我们要先了解数据存储的方式 数据存储方式 在讲之前我们要先知道值类型和引用类型的存储方式. 在JavaScript数据类型中有两种数据类型. 值类型:字符串(String).数 ...
- 由js深拷贝引起的对内存空间的一些思考
数据类型 js常用数据类型分为基本类型和引用类型 基本类型:null.undefined.数值型.字符串型.布尔型 引用类型:数组.对象 内存空间 var a = [1, 2, 3]; var b = ...
- 理解JS深拷贝
前言: JS的拷贝(copy),之所以分为深浅两种形式,是因为JS变量的类型存在premitive(字面量)与reference(引用)两种区别.当然,大多数编程语言都存在这种特性. 众所周知,内存包 ...
- js深拷贝与浅拷贝
1 基础知识:基本类型与引用类型 JS中可以把变量分成两部分,基本类型和引用类型. 基本类型包括:Undefined.Null.Boolean.Number和String: 引用类型值可能由多个值构成 ...
- JS深拷贝/深克隆(面试用)
晒下我的比较浅显的深拷贝,没有考虑原型和循环引用,可以拷贝一些js原生类型,用于面试用. function deepClone(obj){ if(Object.prototype.toString.c ...
- js深拷贝、浅拷贝
浅拷贝: 只针对当前对象的属性进行拷贝,若当前对象的属性是引用类型时,这个不考虑,不进行拷贝.若属性是引用类型,拷贝后引用的是地址,如果进行更改,会影响拷贝的原对象属性. 深拷贝:针对当前对象的数据的 ...
随机推荐
- HDOJ 1561 - 树形DP,泛化背包
刚看题...觉得这不是棵树...可能有回路...仔细一想..这还真是棵树(森林)...这是由于每个城堡所需要提前击破的城堡至多一个..对于一个城堡.其所需提前击破的城堡作为其父亲构图.... dp[k ...
- C++ Primer 读书笔记 第2章 变量和基本类型
C++ Primer 第二章 变量和基本类型 2.1 基本内置类型 C++定义了一组表示整数.浮点数.单个字符和布尔值的算术类型(arithmetic type),此外还定义了Void类型. 算术类型 ...
- JavaScript之JS实现动画效果
在前面的随笔中介绍了如何用DOM技术修改文档的央样式信息,用JavaScript添加样式信息可以节约我们的时间和精力,但总的来说,CSS仍是完成这类任务的最佳工具.但是有一个应用领域是目前的CSS无能 ...
- WPF之Binding的三种简单写法
环境 类代码 public class Person:INotifyPropertyChanged { private string name; public string Name { get { ...
- 将窗口置顶的方法:SetWindowPos、AttachThreadInput、SwitchToThisWindow
将窗口置顶的方法:SetWindowPos.AttachThreadInput.SwitchToThisWindow [转]http://hi.baidu.com/neil_danky/item/f9 ...
- poj 3252 Round Numbers 数位dp
题目链接 找一个范围内二进制中0的个数大于等于1的个数的数的数量.基础的数位dp #include<bits/stdc++.h> using namespace std; #define ...
- CCNA实验(7) -- NAT
1.静态NAT2.动态NAT3.复用内部全局地址的NAT(PAT) enableconf tno ip do loenable pass ciscoline con 0logg syncexec-t ...
- Java知识点复习
总结下java的知识点 final 关键字-方法:不能被子类重写(override)-变量:不能被修改-类:不可以被继承,派生子类 finally 关键字与try/catch语句配合使用,即使有异常抛 ...
- 第八届河南省赛B.最大岛屿(dfs)
B.最大岛屿 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 30 Solved: 18 [Submit][Status][Web Board] De ...
- [置顶] js模板方法的思路及实现
在js中如何实现设计模式中的模板方法? 思路的产生必然要求熟悉js,如何实现?就很简单了,都知道在js中如果定义两个相同名称的方法,前一个方法就会被后一个方法覆盖掉,使用此特点就可以实现模板方法. 例 ...