博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈js中的继承和拷贝(下)
阅读量:6916 次
发布时间:2019-06-27

本文共 2188 字,大约阅读时间需要 7 分钟。

拷贝

  在 中我们将了js继承的几种方式。这一节我们来讲一下,js对象的拷贝。为什么会出现拷贝。我们来看一个列子,您大致就明白了。

var a = {
b:1}var b = aa.b =2console.info(b.b) //2复制代码

  我们可以看到,两个对象是同一个内存地址,我们改变了a.b然而我们的b.b被动的改变了。所以这时候出现了一个东西叫对象的拷贝。此时我们又要引出两个概念:浅拷贝,深拷贝

浅拷贝

  顾名思义,浅拷贝是说只是拷贝表层,并不会深入的拷贝对象。换句话说一个对象,它只会拷贝一层,而不会拷贝对象中的子对象。让我们看下几种浅拷贝的实现方式。

对象

  对象的拷贝

遍历实现浅拷贝

var obj1 ={	a:1}var obj2 = {	b:2};function extendCopy(p,s) {	var c = {};	for (var i in p) { 		c[i] = p[i];	}	for (var j in s) { 		c[j] = s[j];	}	return c;}var newObj = extendCopy(obj1,obj2);console.info(newObj); // {a: 1, b: 2}复制代码

es6中Object.assign实现浅拷贝

// 对象浅拷贝, 复制所有可枚举属性const obj1 = {
a: 1};const obj2 = {
b: 2};// copy obj1 and obj2 to a new obj;const newObj = Object.assign({}, obj1, obj2)console.log(newObj) {a: 1, b: 2}复制代码

es6中结构赋值实现浅拷贝

const obj1 = {
a: 1, b: 2};// obj2 equal obj1const obj2 = {...obj1};console.log(obj2) // {a: 1, b: 2}复制代码

数组

  数组的拷贝。

遍历拷贝。

const arr = [1,2,3];let newarr = [];arr.map((data)=>{	newarr.push(data)});console.log(newarr); //[1,2,3]复制代码

Array.from(要复制的数组);

const arr=[1,2,3];const newarr =Array.from(arr);console.info(newarr); //[1,23]复制代码

...结构赋值

const arr=[1,2,3];const newarr=[...arr];console.info(newarr); //[1,2,3]复制代码

深拷贝

  好了我们大概已经知道几种浅拷贝的方式和方法。下面我们来介绍下复杂的数据怎么办,很简单深拷贝。目前深拷贝有很多实现方式,比如lodash啊,jq啊,还有原生的js,我们这里大概枚举一些常用的。

Underscore库 _.clone()

var x = {    a: 1,    b: { z: 0 }};var y = _.clone(x);复制代码

jQuery —— $.extend()

var x = {    a: 1,    b: { f: { g: 1 } },    c: [ 1, 2, 3 ]};var y = $.extend({}, x),          //shallow copy    z = $.extend(true, {}, x);    //deep copy复制代码

lodash _.cloneDeep(value)

var objA = { "name": "colin" };var objB = _.cloneDeep(objA);复制代码

原生js字符串

var obj = {
"a":1,"b":2}var newObj = JSON.parse((JSON.stringify(obj)))复制代码

自己来封装一个diy

var cloneObj = function(obj){    var str, newobj = obj.constructor === Array ? [] : {};    if(typeof obj !== 'object'){        return;    } else if(window.JSON){        newobj = JSON.parse(JSON.stringify(obj));    } else {        for(var i in obj){            newobj[i] = typeof obj[i] === 'object' ?             cloneObj(obj[i]) : obj[i];         }    }    return newobj;};复制代码

结语

  好了,今天的拷贝内容终于完结了,记录代码记录知识,本博客就是快准狠,直接上代码片段,希望喜欢的朋友给点支持多多转发,不说了,抽烟去了。

转载地址:http://esacl.baihongyu.com/

你可能感兴趣的文章
通过Eclipse安装Aptana Studio 3
查看>>
我的友情链接
查看>>
Packet Tracer 5.0建构CCNA实验攻略(17)——终结篇
查看>>
V-3-3 在没有vCenter的情况下,复制虚拟机
查看>>
Windows脚本初探之PowerShell脚本执行策略
查看>>
Windows脚本初探之PowerShell流程控制break
查看>>
DNS动态更新|安全和非安全的区别
查看>>
统计一行输入中有多少个汉字
查看>>
第3章 玩转mysql第三天 3-17- 范式基础篇
查看>>
我的友情链接
查看>>
Zabbix-proxy的搭建和配置全过程
查看>>
shell 中获取一个uuid
查看>>
Paxos算法
查看>>
linux 开机流程
查看>>
context 和 getApplicationContext()
查看>>
谷歌眼镜计划明年“高价”上市
查看>>
桌面虚拟化简介
查看>>
Andriod 第五课----图形界面
查看>>
linux 控制sshd的远程访问
查看>>
telnet命令 date命令
查看>>