病理

基本类型的传递就是按值传递,比如说

    var a = 1;
var b = a;
b = 3;
console.log(a,b);//1,3

很明显,a的值并未因为b的值改变而变化,这是因为a只是给了b一个副本。在这就不详细描述了。下面才是重点

    let obj = {x:1};
let o = obj;
o.x = 2;
console.log(obj.x);//2 已经被改动了

对此我在前面的 js函数参数的传递 中有具体介绍,在这就不多说了。

对症下药

  1. 毛主席说过,遇事莫要急,碰到问题就要解决问题(其实没说过)。知道了是什么原因就好办了,我们把对象直接克隆,也可以叫做深拷贝。

    const deepCopy = function(obj){
    var result = {};
    for(let k in obj){
    result[k] = typeof obj[k]===’object’? deepCoyp(obj[k]): obj[k];
    }
    return result;
    }

    定义一个方法,参数是一个对象obj,然后通过for...in循环获取属性值obj[k],然后将属性值赋值给result中的k属性。其实就是将对象转换为基本类型进行复制了。再试下上面的例子。

    let o = deepCopy(obj);
    o.x = 2;
    console.log(obj.x);// 1

    ok,我们完成复制了。

  2. 以上纯js的办法,当然jquery有一个方法extend(boolean,dest,src1,src2,src3...)可以用来实现对象深层拷贝。第一个参数为true时,表示进行深度拷贝,第二个参数及后面的参数表示将src1,src2,src3...合并到dest中,返回值为合并后的dest。但是这样会使dest的结构发生变化,如果不想修改dest的结构可以将其设为{}。

    let o = $.extend(true,null,obj);
    o.x = 2;
    console.log(obj.x); // 1
  3. 众望所归的es6中的Object.assign()也可以实现深层拷贝。但是es6深复制只有一层,也就是说像obj.a.b=1这种的Object.assign()是不能进行深复制的。下面我们来看代码吧。

    let obj = {
    a : 1,
    b : {
    c : 2
    }
    };
    let result = Object.assign({},obj);
    result.a = 4;
    result.b.c = 3;
    console.log(obj); // {a:1,b:{c:3}}

    这就是assign()方法,比jquery的extend()更容易理解,参数更简单。当然es7中的深层拷贝就更加方便了,这里我就提一下就好了。还是上面的例子吧,直接let obj1 = {...obj,a:4},有没有被惊倒!

    总结

    对于我的问题,选择了extend,因为简单嘛,而且不用转码和考虑兼容性。还有就是碰到问题一定要去debug,这样才能找出原因,然后想办法解决就好了。

再议js的传递和深复制的更多相关文章

  1. 一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝)

    背景 在日常开发中,偶尔会遇到需要复制对象的情况,需要进行对象的复制. 由于现在流行标题党,所以,一文带你了解js数据储存及深复制(深拷贝)与浅复制(浅拷贝) 理解 首先就需要理解 js 中的数据类型 ...

  2. 再议 js 数字格式之正则表达式

    原文:再议 js 数字格式之正则表达式 前面我们提到到了js的数字格式<浅谈 js 数字格式类型>,之前的<js 正则练习之语法高亮>里也提到了优化数字匹配的正则.不过最近落叶 ...

  3. js对象或数组深复制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. js 对象深复制,创建对象和继承

    js 对象深复制,创建对象和继承.主要参考高级编程第三版,总结网上部分资料和自己的代码测试心得.每走一小步,就做一个小结. 1.对象/数组深复制 一般的=号传递的都是对象/数组的引用,如在控制台输入 ...

  5. 也来谈一谈js的浅复制和深复制

    1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,unde ...

  6. js的浅复制和深复制

    1.浅复制VS深复制 本文中的复制也可以称为拷贝,在本文中认为复制和拷贝是相同的意思.另外,本文只讨论js中复杂数据类型的复制问题(Object,Array等),不讨论基本数据类型(null,unde ...

  7. js中的深复制与浅复制

    前言 所谓深复制与浅复制(深拷贝与浅拷贝),乍一听感觉听高大上,像是一个非常难理解的概念,其实我们平常项目开发都是在用的,只是你可能不知道该怎么叫它的名字而已,就像你听熟了一首歌,就是不知道这首歌叫什 ...

  8. js中的深复制和浅复制

    在实际情况中经常会遇到对对象复制的问题.比如在处理项目中的一笔多结构的数据存储或者调用,这个时候你就要对对象(json)进行操作,而不同的操作根据不同的需求来定义.其中最常见最普遍的是对对象的复制,重 ...

  9. js深复制

    一般来讲深复制主要是为了复制js对象中的引用类型,引用类型在普通的赋值操作下相当于是引用,修改复制对象也会影响原对象,简单的方法的话可以使用JSON.parse(JSON.stringify(obj) ...

随机推荐

  1. windows设置代理.bat 脚本

    按照下列脚本复制到记事本中,保存,重命名后缀为.bat,使用时双击即可. 设置代理.bat,修改下列脚本中的代理地址和端口号 @echo off echo 开始设置IE代理上网 reg add &qu ...

  2. List(JDK1.7)(1)

    java.util包. 与Set不同, List允许重复的元素.即 e1.equals(e2). 部分方法定义 int size(); 返回列表中元素的个数,如果超过Integer.MAX_VALUE ...

  3. HTML5新增的本地存储功能(笔记)

    HTML5新增的本地存储功能分为两种,分别对应两个JS对象:①本地存储对应localStorage对象,主要用于长期保存整个网站的数据(这些数据可以永久保存在客户端电脑硬盘内).②会话存储对应sess ...

  4. 10 款非常棒的CSS代码格式化工具推荐

    如果你刚开始学习CSS,这意味着你的很多代码或结构可能需要优化,比如你可能过多使用了类.添加了多余的间隔或空行等等,这将导致代码臃肿.混乱,可读性和执行效率将大大降低. 本文为你整理了几款CSS工具, ...

  5. thinkphp 原数据更新

    调用TP的save方法更新数据时,如果新数据与数据库中得数据一致, 那么执行M('table')->save(data)方法时,该方法会返回false.现在的需求是,哪怕用户要更新的数据与原数据 ...

  6. Django rest framwork

    Restful API REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角度类 ...

  7. SQLServer数据操作(建库、建表以及数据的增删查改)[转]

    SQLSever数据操作   一.建立数据库:   create database DB ---数据库名称 (          name=data1 --文件名,          filename ...

  8. oracle 创建表空间 、用户 、赋权、建表

    一.创建表空间 1.创建临时表空间 create temporary tablespace TS_TEM_TAB_SPACE tempfile 'D:\oracle\TS_TEM_TAB_SPACE. ...

  9. MySQL 5.7.17 Group Relication(组复制)搭建手册【转】

    本博文介绍了Group Replication的两种工作模式的架构.并详细介绍了Single-Master Mode的部署过程,以及如何切换到Multi-Master Mode.当然,文末给出了Gro ...

  10. Python 使用 Redis 操作

    1.redis简介 redis是一款开源免费的高性能key-value数据库,redis特点: 支持更多的数据类型:字符串(String).列表(List).哈希(Map).数字(Int).集合(Se ...