js实现深拷贝
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js实现深拷贝相关的知识,希望对你有一定的参考价值。
参考技术A 基本数据类型: String、Number、Boolean、Null、Undefined
复杂数据类型: Object
使用typeof进行判断数据类型,只能够判断基本数据类型string number boolean 以及 function,而null和object不能够进一步的判断。
使用A instanceof B的方式进行判断,字面意思,A是否是B的实例,可以判断出Array和Object类型,但是undefined和null不能区分数据类型,基础的数据类型,因为不是使用new出来的,也测试不出来。
Object.prototype.toString()方法可以返回一个表示该对象的字符串\'[object type]\',为了每个对象都能通过 Object.prototype.toString() 来检测,需要以 Function.prototype.call() 或者 Function.prototype.apply() 的形式来调用,传递要检查的对象作为第一个参数,称为 thisArg。
实现思路:
其实还有很多深拷贝的方式,比如说Object.assign(),JSON.stringify()等方式,可以自己下去尝试一下哦!
js手写深拷贝的实现
一、深浅拷贝的定义:
1、对于简单数据类型要实现深拷贝,用简单的复制方法即可;
2、对于引用数据类型,若用简单的复制语句,就只是复制了数据的地址,若源对象发生改变,那么复制的数据也会发生改变,这时就需要深浅拷贝来实现了;浅拷贝是针对一层的复制,即对象中的元素是基本数据类型;当对象的元素不是基本数据类型时,即多层,将用到深拷贝的方式;
二、手写一个通用的拷贝函数
该函数对简单数据类型和引用数据类型都能实现深拷贝
而对于引用数据类型的一层和多层都适用
function copyObj(obj){ var cloneObj; //当输入数据为简单数据类型时直接复制 if(obj&&typeof obj!==‘object‘){cloneObj=obj;} //当输入数据为对象或数组时 else if(obj&&typeof obj===‘object‘){ //检测输入数据是数组还是对象 cloneObj=Array.isArray(obj)?[]:{}; for(let key in obj){ if(obj.hasOwnProperty(key)){ if(obj[key]&&typeof obj[key]===‘object‘) { //若当前元素类型为对象时,递归调用 cloneObj[key] = copyObj(obj[key]); } //若当前元素类型为基本数据类型 else{cloneObj[key]=obj[key];} } } } return cloneObj; }
以上是关于js实现深拷贝的主要内容,如果未能解决你的问题,请参考以下文章