精华内容
下载资源
问答
  • javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法前言在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示: 如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并...

    javascript 数组以及对象的深拷贝(复制数组或复制对象)的方法

    前言

    在js中,数组和对象的复制如果使用=号来进行复制,那只是浅拷贝。如下图演示:

    如上,arr的修改,会影响arr2的值,这显然在绝大多数情况下,并不是我们所需要的结果。
    因此,数组以及对象的深拷贝就是javascript的一个基本功了。

    评论中有很多人说我误导大家。说这些都是浅拷贝。我不做过深的阐述,本文中涉及到的都是比较浅显的内容。诸位请根据自己的需要以及情况自行判断和理解。

    数组的深拷贝

    条条大道通罗马,实现数组的深拷贝,是有好几种方法的。举例如下:

    for 循环实现数组的深拷贝

    for循环是非常好用的。如果不知道高级方法,通过for循环能够完成我们大多数的需求。

    var arr = [1,2,3,4,5]
    var arr2 = copyArr(arr)
    function copyArr(arr) {
    	let res = []
    	for (let i = 0; i < arr.length; i++) {
    	 res.push(arr[i])
    	}
    	return res
    }
    

    如上,通过对数组的for循环,即可实现对数组的深拷贝了。

    slice 方法实现数组的深拷贝

    这个代码实现非常简单。原理也比较好理解,他是将原数组中抽离部分出来形成一个新数组。我们只要设置为抽离全部,即可完成数组的深拷贝。代码如下:

    var arr = [1,2,3,4,5]
    var arr2 = arr.slice(0)
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    更多 slice 内容请访问 w3school JavaScript slice 方法

    concat 方法实现数组的深拷贝

    这个代码也非常简单,原理更加粗暴。它是用于连接多个数组组成一个新的数组的方法。那么,我们只要连接它自己,即可完成数组的深拷贝。代码如下:

    var arr = [1,2,3,4,5]
    var arr2 = arr.concat()
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    更多 concat 内容请访问 w3school JavaScript concat 方法

    2017年10月31日补充:ES6扩展运算符实现数组的深拷贝

    OK,以上之前讲的方法全部过时了,用下面的方法实现数组的深拷贝是最简单的。

    var arr = [1,2,3,4,5]
    var [ ...arr2 ] = arr
    arr[2] = 5
    console.log(arr)
    console.log(arr2)
    

    运行结果如下:

    ES6扩展运算符实现数组的深拷贝

    对象的深拷贝

    对象的深拷贝相比数组也没有困难许多,列举两个方法。

    万能的for循环实现对象的深拷贝

    在很多时候,for循环能够解决大问题。

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var obj2 = copyObj(obj)
    function copyObj(obj) {
      let res = {}
      for (var key in obj) {
        res[key] = obj[key]
      }
      return res
    }
    

    转换成json再转换成对象实现对象的深拷贝

    上面的代码实在是比较长,所以,用一个更暴力的方法吧!代码如下:

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var obj2 = JSON.parse(JSON.stringify(obj))
    

    这个原理没什么好解释的,实在是够简单粗暴的啦!

    2017年10月31日补充: 扩展运算符实现对象的深拷贝

    var obj = {
      name: 'FungLeo',
      sex: 'man',
      old: '18'
    }
    var { ...obj2 } = obj
    obj.old = '22'
    console.log(obj)
    console.log(obj2)
    

    运行结果如下:

    扩展运算符实现对象的深拷贝

    小结

    数组和对象的深拷贝是js中最常见的应用。理解各种方法是必须的。希望对大家有所帮助。
    本文中并没有对异常进行处理,主要在讲原理。更多的数组以及对象的操作方法,可以参考lodash的源码,查看它的源码可以让你的js基础变得非常牢固。我也在学习中。

    2017年10月31日补充,使用es6提供的扩展运算符的方法实现深拷贝,简单,高效。并且,对象的深拷贝不会像使用 JSON 方法深拷贝一样,丢失函数等信息,只能用来深拷贝 JSON 数据格式的对象。推荐大家使用。

    补充一个数组去重的方法

    function dedupe(array) {
      return [...new Set(array)]
    }
    var arr = [1,2,2,3,3,4,4,5,5]
    console.log(dedupe(arr))
    

    运行结果如下:

    JS数组去重的方法

    2021年03月29日 补充

    这里说的深拷贝,都是指一维的数组和对象的深拷贝。鉴于评论中多人指出,这些是浅拷贝,我本来不想回应,但是提出这个观点的人很多,因此我在这边回应一下。

    浅拷贝的概念不重复了,上文中已经说明。文章中的多种方法,均不是浅拷贝,只是是否支持多维数据而已。而在绝大多数场景下,文中的方法是适用的。

    想要简便的支持多维数据的深拷贝,可以直接适用 JSON 方式。或适用 lodash 工具实现。

    版权申明:本文由FungLeo原创,允许转载,但转载必须附注首发链接。谢谢。

    展开全文
  • 同步复制与异步复制

    万次阅读 2021-06-21 10:36:30
    主从复制:其中一种设计,包括一个同步的从节点,和一个异步的从节点。 从节点2在接收复制日志之前有一段很长的延迟。通常情况下,复制速度会非常快,例如多数数据库系统可以在一秒之内完成所有从节点的更新。但是,...

    主从复制:其中一种设计,包括一个同步的从节点,和一个异步的从节点。

    从节点2在接收复制日志之前有一段很长的延迟。通常情况下,复制速度会非常快,例如多数数据库系统可以在一秒之内完成所有从节点的更新。但是,系统其实并没有保证一定会在多长时间内完成复制。有些情况下,从节点可能落后主节点几分钟甚至更长时间,例如,由于从节点刚从故障中恢复,或者系统已经接近最大设计上限,或者节点之间的网络出现问题。

    同步复制的优点是:一旦向用户确认,从节点可以明确保证完成了与主节点的更新同步,数据已经处于最新版本。万一主节点发生故障,总是可以在从节点继续访问最新数据。缺点则是:如果同步的从节点无法完成确认(例如:由于从节点发生崩溃,或者网络故障,或任何其他原因),写入就不能视为成功。主节点会阻塞其后所有的写操作,直到同步副本确认已完成。

    因此,把所有从节点都配置为同步复制有些不切实际。因为这样子的话,任何一个同步节点的中断都会导致整个系统更新停滞不前。**实践中,如果数据库启用了同步复制,通常意味着其中某一个从节点是同步的,而其他节点这是异步模式。**万一同步的从节点变得不可用或性能下降,则将另一个异步的从节点提升为同步模式。这样可以保证至少有两个节点(即主节点和一个同步从节点)拥有最新的数据副本。这种配置有时候也叫做半同步。

    主从复制还经常会被配置为全异步模式。此时如果主节点发生失败且不可恢复,则所有尚未复制到从节点的写请求都会丢失。这意味着即使向客户端确认了写操作,却无法保证数据的持久化。但是全异步配置的优点则是,不管从节点上数据多么滞后,主节点总是可以继续响应写请求,系统的吞吐性能更好、

    异步模式这种弱化的持久性听起来是一个非常不靠谱的折中设计,但是异步复制还是被广泛使用,特别是那些从节点数量巨大或者分布于广域地理环境。我们常见的问题,会有复制滞后问题

    配置新的从节点:
    当如果出现以下情况下,如需要增加副本数以提高容错能力,或者替换失败的副本,就需要考虑增加新的从节点。但是如何确保新的从节点和主节点保持数据一致呢?

    简单地将数据文件从一个节点复制到另一个节点通常是不够的,主要是因为客户端仍在不断得向数据库写入新数据,数据始终处于不断变化之中,因此常规的文件拷贝方式将会导致不同节点上呈现出不同时间点的数据,这不是我们所期待的。

    或许应该考虑锁定数据库(使其不可写)来使磁盘上的文件保持一致,但是这会违反高可用的设计目标。好在我们可以做到在不停机,数据服务不中断的前提下完成从节点的设置。逻辑上的主要操作步骤如下:

    1. 在某个时间点对主节点的数据副本产生一个一致性的快照。这样子避免长时间锁定整个数据库,炉前大多数数据库都支持此功能,快照也是系统备份锁必须的。而在某些情况下,可能需要第三方工具,入MYSQL的innobackupex
    2. 将此快照拷贝到新的从节点
    3. 从节点链接到主节点并请求快照点之后所发生的的数据更改日志;因为在第一步创建快照时候,快照与系统复制日志的某一个确定位置相关联,这个位置信息在不同的系统中有不同的称呼,
    4. 获得日志之后,从节点来应用这些快找点之后所有数据变更,这个过程称之为追赶。接下来,他可以继续处理主节点上新的数据变化。并且重复步骤一~步骤4

    从节点失效:追赶式恢复
    主节点失效:节点切换

    上述这些问题,包括节点失效,网络不可靠,副本一致性,持久性,可用性与延迟之间各种细微的权衡,实际上正是分布式系统核心的基本问题。

    基于行的逻辑日志复制 mySql
    另一种方法就是复制和存储引擎采用不同的日志格式,这样复制与存储逻辑剥离,这种复制日志称为逻辑日志,用来区分物理存储引擎的数据表示。

    关系型数据库的逻辑日志通常是指一系列记录来描述数据表行级别的写请求:

    1. 对于行插入,日志包含所有相关列的新值。
    2. 对于行删除,日志里有足够的信息来唯一标识已经三处的行,通常是靠主键,但是如果表上没有定义
      主键,就需要记录所有列的旧值
      3.对于行更新,日志包含足够的信息来唯一表示更新的行,以及所有列的新值(或者至少包含所有已经更新列的新值)

    如果一条事务设计多行的修改,则会产生多个这样的日志记录,并在后面跟着一条记录,指出该事务已经提交。Mysql的二进制日志binlog(当配置为基于行的复制时)使用该方式。

    从节点最终会赶上并且与主节点保持一致,这种效应也被称为最终一致性。正常情况下,主节点和从节点上完成写操作之间的时间延迟(复制滞后)可能不足1秒,这样子的滞后,在实践中中通常不会导致太大的影响。但是,如果系统已经接近设计上线,或者网络存在问题,则滞后可能轻松增加到几秒甚至几分钟不等。

    离线客户端操作:
    另一种多主复制比较适合的场景是:应用在于网络断开后还需要继续工作。

    展开全文
  • sql server完整复制数据库

    万次阅读 多人点赞 2018-06-05 15:05:43
    当需要完整的复制一个数据库时,不清楚原理的时候往往会出现各种问题。下面讲解一种简单易操作的数据库复制方法。步骤一:在Microsoft sql server Management studio中,将源数据库进行备份,生成一个备份文件dbname...

    当需要完整的复制一个数据库时,不清楚原理的时候往往会出现各种问题。下面讲解一种简单易操作的数据库复制方法。

    步骤一:在Microsoft sql server Management studio中,将源数据库进行备份,生成一个备份文件dbname.bak;记住备份文件存放的地址,或者复制下来,以防一会找不到;

    步骤二:在Microsoft sql server Management studio中,新建一个数据库dbname2(与源数据库名称不一样);新建数据库的时候记住或者重新指定数据库文件存放的路径,我这里指定到自定义目录;创建后在E:\data下生成2个文件;

        

            

    展开全文
  • linux复制/剪切文件到另一个文件夹

    万次阅读 多人点赞 2018-10-31 11:27:50
    复制/拷贝: cp 文件名 路径 cphello.csv ./python/ml:把当前目录的hello.csv拷贝到当前目的python文件夹里的ml文件夹里 cp 源文件名 新文件名 cp hello.txt world.txt:复制并改名,并存放在当前目录下 cp file1...

    复制/拷贝:

    cp  文件名  路径      cp  hello.csv  ./python/ml:把当前目录的hello.csv拷贝到当前目的python文件夹里的ml文件夹里

    cp 源文件名  新文件名   cp  hello.txt   world.txt:复制并改名,并存放在当前目录下  

    cp file1 file2 复制一个文件 
    cp dir/* . 复制一个目录下的所有文件到当前工作目录 
    cp -a /tmp/dir1 . 复制一个目录到当前工作目录 
    cp -a dir1 dir2 复制一个目录 

    剪切/移动:

    mv 文件名 路径

    mv hello.csv ./python:把当前目录的hello.csv剪切到当前目的python文件夹里

    mv  hello.txt  ../java/   把当前目录下的文件hello.txt剪切到上一级目录的子目录java目录里

    mv  hello.txt  ..     把文件hello.txt移动到上一级目录

    扫描下方二维码关注领取程序员必备千套ppt模板,300本精选好书,丰富面经。:

    有酒有风

     

    展开全文
  • 特别是,提供了支持文件复制和删除的功能。 文件复制到其他文件夹操作 shutil.copyfile(src, dst):将名为src的文件的内容(无元数据)复制到名为dst的文件中 。 dst必须是完整的目标文件名 注意:所谓完整目标文件名...
  • mysql复制--主从复制配置

    万次阅读 多人点赞 2018-04-12 00:04:36
    复制功能: 数据分布 负载均衡(读) 备份 高可用和故障切换 MySQL升级测试 复制方式: 主–从复制 主–主复制 半同步复制 复制原理: Mysql中有一种日志叫做bin日志(二进制...
  • 1、将一个文件夹下的所有内容复制到另一个文件夹下 cp -r /home/packageA/* /home/cp/packageB/ 或 cp -r /home/packageA/. /home/cp/packageB/ 这两种方法效果是一样的。 方法示例: 2、将一个文件夹复制到另一...
  • java文件处理(3)——实现文件复制和文件移动

    万次阅读 多人点赞 2018-10-07 17:31:16
    通过二进制流的操作方式把程序调整为可以实现对任何类型文件进行文件复制(而不是调用windows命令行的内部命令copy)。 通过二进制流的操作方式把程序调整为可以实现对任何类型文件进行文件移动(而不是调用windows...
  • 高性能Mysql主从架构的复制原理及配置详解

    万次阅读 多人点赞 2012-03-06 07:46:32
    温习《高性能MySQL》的复制篇. 1 复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础。将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)...
  • 终于知道为啥网页不让我复制粘贴了!

    万次阅读 多人点赞 2021-03-24 11:18:38
    摘要:我们在项目中,通常为了保证数据安全性和保护用户个人信息,个别页面需要禁用右键、复制、粘贴以及输入框自动填充的功能。所以在此补充和总结几条我们开发中常用的操作方式。
  • VMware虚拟机复制文件卡死的解决

    万次阅读 多人点赞 2020-03-30 14:41:36
    VMware虚拟机复制文件卡死的解决 今天做实验配好了实验环境,刚复制一个几十m的文件虚拟机就卡死了… 原因 百度之,原来是前几天更新了win10到1903,导致VMware版本不适配,更新到15.1以上就可以解决这个问题 下载...
  • Vim中如何全选复制粘贴、批量注释

    万次阅读 2015-07-30 16:37:47
    Vim中如何全选并复制? (区分大小写!!!) 全部删除:按esc键后,先按gg(到达顶部),然后dG 全部复制:按esc键后,先按gg,然后ggyG 全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG 单行复制:按esc...
  • vi/vim 复制剪切粘贴以及常用命令小结

    万次阅读 多人点赞 2016-01-21 10:34:24
    接触linux操作系统之后使用vi/vim编辑器用的就比较多,其实vi/vim编辑文件特别方便,但是一些常见的指令模式下的命令确很容易忘,特别是复制剪切粘贴经常忘,所以小结下以后查用起来比较方便。1.复制剪切粘贴撤销 ...
  • ID卡复制教程(使用T5577卡复制4100卡)

    万次阅读 多人点赞 2017-07-16 12:58:14
    为了复制普通ID卡,通常采用T5577 或 EM4305卡(俗称ID白卡),其特点是内部EEPROM可读可写,修改卡内EEPROM的内容即可修改卡片对外的ID号,达到复制普通ID卡的目的。 本文以T5577卡复制普通EM4100卡。读者需具备...
  • 长按复制,在微信小程序内的文字无法长按复制,除了text节点以外,但是要在text标签内加一个“selectable”属性。 话不多说,我们直接上代码 1.WXML < text selectable="true" >长按复制< text/> 二...
  • 空格符号复制html,空格网名符号复制

    万次阅读 2021-06-14 06:13:25
    空格网名符号复制搜狗输入法,v+1 在按下d 就是空格 :这里空格【】 这里还有一个空格: []弄了,在游戏里就是空白名空格符号复制法一:搜狗输入法将半角转换全角,快捷键(Shift+空格键),按空格(根据:半角空格...
  • 不是会员不让复制粘贴?看我“三板斧”!

    千次阅读 多人点赞 2021-05-09 18:43:25
    不知道你有没有过这样的经历,我们在网上好不容易搜索到自己想要的内容,复制粘贴时,却被网站要求注册或者购买VIP会员,非常得令人生气和无奈。今天,我们就来介绍一个非常好用的方法来解决这一系列问题。 正文 ...
  • 复制的原理: 物理复制也叫流复制,流复制的原理是主库把预写WAL文件发送给备库,备库接收WAL文件后,根据这些WAL文件进行重放。 复制的原理: 逻辑复制也是基于WAL文件,在逻辑复制中把主库称为源端库,备库称为...
  • 加密狗复制机增强版(加密狗复制软件)可以复制串口、并口、USB加密狗
  • 通过浏览器的 F12 开发者工具可以看到现在翻译后的内容是通过图片展示的,而之前是文字只是把复制功能禁用了而已,所以现在不管怎么处理也不能进行复制了。 这种情况下要想进行复制就需要使用图像识别功能了。 最新...
  • 一,概述python中对文件和文件夹进行移动、复制、删除、重命名,主要依赖os模块和shutil模块,要死记硬背这两个模块的方法还是比较困难的,可以用一个例子集中演示文件的移动、复制、删除、重命名,用到的时候直接...
  • C++深复制和浅复制

    万次阅读 多人点赞 2014-04-09 10:22:30
    对象的复制复制构造函数;浅复制和深复制;再一个深复制的例子

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,471,057
精华内容 1,388,422
关键字:

复制