JavaScript

JavaScript对象的浅拷贝与深拷贝

Manan
概述 在JavaScript中对象的类型可以分为值类型和引用类型两种,值类型有:number,string,boolean,null,undefined,symbol等。引用类型有:object,function等。 JavaScript的对象为引用类型,所以对象变量作为右值赋值的操作实际上是引用的拷贝操作,即两个变量引用同一块内存区域。值类型的变量在作为右值赋值给一个左值变量时是对内存区域的拷贝。由此也就引出了JavaScript中对象的拷贝问题。 浅拷贝是指只拷贝对象中值类型变量,引用类型的变量依然采用引用拷贝。深拷贝是讲变量所有的内容重新拷贝一份到新的内存区域中,无论是值类型还是引用类型。 浅拷贝 JavaScript对象的浅拷贝实现有多种方式,常用的有 迭代对象 Object.assign 对象展开 1. 迭代对象 function shadowCopy(src) { const dst = new src.constructor(); for (const [prop, val] of Object.entries(src)) { dst[prop] = val; } return dst; } 这里采用构造函数去实例化对象,而不是采用对象字面量{}来创建的原因是保留对象的原型链信息。 2. Object.assign function shadowCopy(src) { const dst = new src.constructor(); return Object.assign(dst, src); } 3. 对象展开 function shadowCopy(src) { return { ...src }; } 深拷贝 在有浅拷贝作为前置知识的情况下,深拷贝很容易实现。 深拷贝主要要解决问题时完成对对象中引用类型属性的复制,当属性为值类型时,直接执行对象的浅拷贝,当遇到一个引用类型的属性时,可以递归按照之前设计的对象浅拷贝逻辑进行。 function doDeepCopy(src, dst) { for (const [prop, val] of Object.

JavaScript ZX——用JS写Shell脚本

Manan
ZX库简介 zx是Google推出的一个运行在Node.js环境下的方便开发人员编写命令行脚本程序的类库。 命令脚本程序是基于特定操作系统,方便完成的一系列批处理工作的脚本程序。在Unix-like的操作系统,通常是使用shell脚本。在Windows系统中使用的则是bat脚本。 这类批处理脚本都有一个共同的特点——语法晦涩不好编写。对于开发人员来说,掌握shell编程的收益并不大。好在Google推出了一款可以在Node运行时环境中进行shell编程的工具类库zx zx的Github项目地址为https://github.com/google/zx,此项目在笔者写下这篇文章时就已经有23k左右的star了,可见这个库确实解决了开发人员的一个痛点。 ZX库的安装 安装ZX之前,需要确保本机具有Node的运行时环境。如果没有安装,可以去NodeJS官网下载,地址为:https://nodejs.org/en/。 NodeJS的安装完毕后,你就可以使用npm(Node Package Manager)来安装zx了。 sudo npm install -g zx 使用ZX写一段shell脚本 zx提供了许多封装好的函数方便你进行shell编程。 例如:question函数,对readline进行了封装,可以更方便的接收shell的输入。同时zx还提供了fetch函数,可以更好的进行网络数据的请求。 在zx中以$符号开头的代表这是一个shell命令,它会立即执行并返回一个Promise,这个Promise被定义为 class ProcessPromise<T> extends Promise<T> { readonly stdin: Writable readonly stdout: Readable readonly stderr: Readable readonly exitCode: Promise<number> pipe(dest): ProcessPromise<T> kill(signal = 'SIGTERM'): Promise<void> } ProcessPromise的返回值为: class ProcessOutput { readonly stdout: string readonly stderr: string readonly exitCode: number toString(): string } 其中如果shell命令执行成功,那么exitCode字段将被设置为0。同时shell命令执行后的输出将会被保存在stdout中。如果执行失败,那么exitCode将为一个非零的整数,命令的输出将会被保存在stderr中。 同时你也可以对shell命令执行后的输出进行重定向: $`git pull`.pipe(streamVar) Demo:自动提交当前代码 #!/usr/bin/env zx // 注意$返回的是一个Promise let { exitCode } = await $"git add .