Node.js 中的copy
想在node中复制对象,搜了下 node util 中的_extend 可以。
在试验过程中,对浅复制有了更深一层的理解。
直接上代码吧,看具体是怎样的。
var extend = require('util')._extend; var obj1 = {x: 5, y:5}; var obj2 = extend({}, obj1); obj2.x = 6; console.log("The obj1.x is " + obj1.x); console.log("The obj2.x is " + obj2.x);
obj1.x 会不会变? 不会,还是5。
obj2.x 会不会被改? 是的,被改成了6。
那我们再来改动下代码,看有什么变化。
var extend = require('util')._extend; var obj1 = {x: 5, y:5, z: {value: 5}}; var obj2 = extend({}, obj1); obj2.z.value =6; console.log("the value of obj1.z.value is " + obj1.z.value); console.log("the value of obj2.z.value is " + obj2.z.value);
再看一下,obj1.z.value 和obj2.z.value 都变成了6。
为什么呢?
_extend属于浅复制,让我们看一下浅复制到底复制些什么。
Wiki上是这么定义的:
One method of copying an object is the shallow copy. In that case a new object B is created,
and the fields values of A are copied over to B.[3][4][5][6] If
the field value is a reference to an object (e.g., a memory address) it copies the reference, hence referring to the same object as A does, and if the field value is a primitive type it copies the value of the primitive type.
可以看出来,对于primitive type, 值会被复制。 而第一个实例中的obj2.x 是number类型,所以值也被复制了,而obj1.x的值不受影响。
对于object, 对象来讲, 只是把对象的引用(reference)复制了。 也就是说两个引用其实指的还是同一个对象。所以obj2.z.value的值被改动后,obj1和obj2 指向的相同对象被更改了,所以都打印出更改后的值。
另,
1. 在stackoverflow 中有对shallow copy 和deep copy 的比较。
2. node中 还可以用如下方式进行对象复制。
var obj2 = JSON.parse(JSON.stringify(obj1));
- node.js中的buffer.copy方法使用说明
- Node.Js Stream(流)-(四)文件copy实例
- node.js里的buffer常见操作,copy,concat等实例讲解
- node.js中的buffer.copy方法使用说明
- 安装并创建第一个Node.js程序
- CentOS7最小化安装 配置NODE.JS环境
- 理解Node.js的事件轮询
- node.js模块之exports
- Node.js安装和入门
- Node.js对MongoDB进行增删改查操作的实例代码
- node.js
- Node.js开发指南 学习日志 3.3.3创建包
- 【0】Node.js环境搭建-安装启动-npm安装扩展包
- Node.js 博客实例(补充一)使用KindEditor
- node.js promise 流程控制
- Node.js开发入门(九)——使用AngularJS内置服务
- nodejs compressor
- ubuntu16.04下用laradock部署nodejs+laravel前后端环境
- Node.js最新技术栈之Promise篇
- (相当全面)node.js 初体验