JavaScript深度克隆
来源:互联网 发布:中文在线发音软件 编辑:程序博客网 时间:2024/05/19 15:26
/** * 方法一 在Object.prototype中添加clone(); * RegExp 类型的对象调用JSON.stringify() 只会打印一个{} */Object.prototype.clone = function () { if (this === null || !(typeof this === "object")) { return this; } else if (Object.prototype.toString.call(this).slice(8, -1) === "Date") { return new Date(this.getTime()); } else if (Object.prototype.toString.call(this).slice(8, -1) === "RegExp") { var pattern = this.valueOf(); var flags = ''; flags += pattern.global ? 'g' : ''; flags += pattern.ignoreCase ? 'i' : ''; flags += pattern.multiline ? 'm' : ''; return new RegExp(pattern.source, flags); } var o = Array.isArray(this) ? [] : {}; for (var attr in this) { if (typeof this[attr] == "object") { o[attr] = this[attr].clone(); continue; } o[attr] = this[attr] } return o;};/* test ---------------------------------------------------------- */var obj = { a: 3, b: "p", c: false, d: function (e) { console.log(e); }, e: undefined, arr: [1, 3, { a: 1, b: "2", arr: [1, new Date(),/[^\d]/g , 3] }]};var object = obj.clone();object.arr[2].arr[0] = 4;console.log(obj.arr[2].arr[0]);console.dir(object)console.log(JSON.stringify(obj));console.log(JSON.stringify(object));
/** * 或者定义一个copy(); * 事实证明 JavaScript的类型自动转换能力真的很强将所有基本类型都包装了 instanceof Object is true (坑爹). */function copy(obj) { if (obj === null || !(typeof obj === "object")) { return obj; } else if (Object.prototype.toString.call(obj).slice(8, -1) === "Date") { return new Date(obj.getTime()); } else if (Object.prototype.toString.call(obj).slice(8, -1) === "RegExp") { var pattern = obj.valueOf(); var flags = ''; flags += pattern.global ? 'g' : ''; flags += pattern.ignoreCase ? 'i' : ''; flags += pattern.multiline ? 'm' : ''; return new RegExp(pattern.source, flags); } // var o = isArray(obj) ? [] : {}; var o = Array.isArray(obj) ? [] : {}; for (var attr in obj) { if (typeof obj[attr] == "object") { o[attr] = copy(obj[attr]); } else { o[attr] = obj[attr]; } } return o;}/* test ---------------------------------------------------------- */var obj = { a: 3, b: "p", c: false, d: function (e) { console.log(e); }, arr: [1, 3, { a: 1, b: "2", arr: [1, 2, 3, { a: "c", arr: ["8", 1], }] }]};console.log(copy(null));console.log(copy(4));var o = copy(obj);o.arr[2].arr[2] = 100;console.log(JSON.stringify(obj));console.log(JSON.stringify(o));/* 附Array.isArray的具体实现方法! ECMAScript5已经实现! 为什么不用instanceof? 因为很多时候instanceof不可靠 比如对象所在Windows不同时! */function isArray(obj) { return typeof obj === "object" && Object.prototype.toString.call(obj).slice(8, -1) === "Array";};
0 0
- javascript中的深度克隆
- javascript深度克隆
- JavaScript 深度克隆
- JavaScript深度克隆
- Javascript 深度克隆
- JavaScript中的深度克隆
- JavaScript深度克隆
- JavaScript对象深度克隆
- JavaScript 深度克隆 JSON 对象
- javascript深度克隆一个对象
- JavaScript的对象深度克隆
- javascript深度克隆一个对象
- javascript实现深度赋值\深度克隆
- javascript中对象的深度克隆
- JavaScript中对象的深度克隆
- javascript中对象的深度克隆
- javascript中对象的深度克隆
- JavaScript的对象深度克隆方法
- 数组中只出现一次的数字
- [shader]纹理遮罩
- Maven搭建
- 深度学习之神经网络结构——残差网络ResNet
- Yii2.0数据库操作增删改查详解 [ 2.0 版本 ]
- JavaScript深度克隆
- Java程序名验证是否是回文字符
- 1087. All Roads Lead to Rome (30)
- UDP在WiFi环境中的丢包问题
- 集合之HashSet/TreeSet原理
- thinkphp5踩坑之部署到服务器模板不存在
- 求命题公式的主范式
- APP拍照扫描识别银行卡SDK
- Jxls+Spring MVC实现Excel导出