在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/

最新文章

  1. Python(八)进程、线程、协程篇
  2. 这两天遇到iphone使用app store下载免费软件,必须验证付款信息才能购物是怎么回事???
  3. JS date常用代码积累
  4. Ios8,Xcode6下 设置Launch Image 启动图片
  5. paramiko模块
  6. 4817 江哥的dp题d
  7. WPF后台设置xaml控件的样式System.Windows.Style
  8. UESTC 898 方老师和缘分 --二分图匹配+强连通分量
  9. 每一个程序员需要了解的10个Linux命令
  10. sealed修饰符
  11. 数据结构(线段树):BZOJ 1568 [JSOI2008]Blue Mary开公司
  12. Android SQLite 简易指北
  13. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法
  14. Linux编程 9 (shell类型,shell父子关系,子shell用法)
  15. HTML5 — 地理定位
  16. redis数据库通过dump.rdb文件恢复数据库或者数据库迁移
  17. 转csdn某位同学的 感谢bmfont
  18. Python Django 之 登录页面
  19. bootstrap-treeview 自定义实现双击事件
  20. 2018.07.03 BZOJ 1007: [HNOI2008]水平可见直线(简单计算几何)

热门文章

  1. android Service 的简单使用(转)
  2. 数据挖掘算法以及其实现zz
  3. Servlet.service() for servlet UserServlet threw exception java.lang.NullPointerException 空指针异常
  4. UVa 1153 Keep the Customer Satisfied (贪心+优先队列)
  5. swoole集群 nginx配置
  6. 创建圆角 抛出一个错误:二元运算符“|”不能用于两个UIRectCorner操作数
  7. [转]解决Mysql InnoDB: Failing assertion: ret || !assert_on_error问题
  8. Unity3d中使用Lua
  9. Java异常:选择Checked Exception还是Unchecked Exception?
  10. JAVA环境下利用solrj二次开发SOlR搜索的环境部署常见错误