在JS中对象一般都是传地址,后续修改也会影响原始数据。例如这样。
var a={ b:"b" }; var c=a; c.b="c"; console.log(a); console.log(c);
会发现a.b也变成了"c"。
以下是网上一位高手写的JS实现值复制,独立复制一个对象,避免双向修改。
//值复制 function clone(obj) { //判断是对象,就进行循环复制 if (typeof obj === 'object' && typeof obj !== 'null') { // 区分是数组还是对象,创建空的数组或对象 var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {}; for (var k in obj) { // 如果属性对应的值为对象,则递归复制 if(typeof obj[k] === 'object' && typeof obj[k] !== 'null'){ o[k] = clone(obj[k]) }else{ o[k] = obj[k]; } } }else{ //不为对象,直接把值返回 return obj; } return o; }
上述代码有一个bug,就是针对null的处理,null在js中的类型是object,上述代码会将null复制成{}。根本的问题在于高手在条件“typeof obj === 'object' && typeof obj !== 'null'”的时候做了错误的判断,试想类型是object了肯定类型就不是null了吧。以下是修正后的方法:
//值复制 function clone(obj) { //判断是对象,就进行循环复制 if (typeof obj === 'object' && obj!=null) { // 区分是数组还是对象,创建空的数组或对象 var o = Object.prototype.toString.call(obj).slice(8, -1) === "Array" ? [] : {}; for (var k in obj) { // 如果属性对应的值为对象,则递归复制 if(typeof obj[k] === 'object' && obj[k]!=null){ o[k] = clone(obj[k]) }else{ o[k] = obj[k]; } } }else{ //不为对象,直接把值返回 return obj; } return o; }
更多个人技术文章请访问:http://88gis.cn/