java零基础 intellij idea汉化 QuarkXPress Markdown编辑器 Nginx 阿里云 Flutter Python爬虫实战 string class webview uiview grunt 后台管理模板 ios视频教程 php抽奖源码 jquery选择子元素 css获取最后一个元素 spark文档 iot系统 pip环境变量配置 python安装配置 python自学 python抛出异常 python开发界面 linux中grep php整站源码 视频加字幕软件哪个好 php四舍五入 0x00000057 linux运维之道 华为ff 万能播放器电脑版 拼多多商家下载 小程序游戏源码 r330不能识别墨盒 qq制作网页 bootskin qq浏览器全屏 微信群群发软件
当前位置: 首页 > 学习教程  > 编程语言

深拷贝浅拷贝,原型,类型校验,递归深拷贝

2021/1/13 20:27:28 文章标签: 测试文章如有侵权请发送至邮箱809451989@qq.com投诉后文章立即删除

深拷贝、浅拷贝 深拷贝和浅拷贝都是针对引用数据类型的 深拷贝:复制变量值,对于非基本类型的变量,递归到基本类型再复制。与原对象完全隔离互不影响。 实现方法:json.parse(json.stringfy(obj)…

深拷贝、浅拷贝

深拷贝和浅拷贝都是针对引用数据类型的
深拷贝:复制变量值,对于非基本类型的变量,递归到基本类型再复制。与原对象完全隔离互不影响。
实现方法:json.parse(json.stringfy(obj))可以使用for in、object.assign、扩展运算符、递归等
浅拷贝:复制属性,只拷贝第一层属性,当前对象的属性值是引用类型时,实质复制的是引用,引用的值也会发生变化
实现方法:直接赋值就可以了

原型
​ JavaScript的所有对象中都包含了一个[proto]内部属性,这个属性所对应的就是自身的原型

​ JavaScript的函数对象,除了原型[proto]之外,还有prototype属性,当函数对象作为构造函数创建实例时,该prorotype属性值将被作为实例对象的[proto]。

数据类型校验
js的数据类型:分为基本数据类型、引用数据类型
基本数据类型:number、string、boolean、undefined、null、symbol(ES6)、bigint(ES10)
应用数据类型:object、function、array
检验数据类型的方式主要有四种
第一种 typeof
可以用来判断基本数据类型,无法判断引用数据类型

//用法 :typeof 要判断的数据  或  typeof(要判断的数据)
//例:
console.log(typeof "");//string
console.log(typeof 1);//number
console.log(typeof true);//boolean
console.log(typeof null);//object
console.log(typeof undefined);//undefined
console.log(typeof []);//object
console.log(typeof function(){});//function
console.log(typeof {});//object
//返回结果为表示数据类型的字符串

第二种 instanceof
判断new关键字创建的引用数据类型

//用法: console.log( 要判断的数据 instanceof 数据类型) 例:
console.log("1" instanceof String);//false
console.log(new String(1) instanceof String);//true
console.log(1 instanceof Number);//false
console.log(new Number(1) instanceof Number);//true
console.log(true instanceof Boolean);//false
console.log(new boolean(false) instanceof boolean);//true
console.log([] instanceof Array);//true
console.log(function(){} instanceof Function);//true
console.log({} instanceof Object);//true
//返回结果为Boolean值

第三种 constructor
constructor 基本上可以应对基本数据类型和引用数据类型的判断,但如果声明了一个构造函数,并且把它的原型指向了Array,constructor也显得力不从心

//用法: console.log( (要判断的数据).constructor === 数据类型 )  例:
console.log( ("1").constructor === String );//true
console.log( (1).constructor === Number );//true
console.log( (true).constructor === Boolean );//true
console.log( ([]).constructor === Array );//true
console.log( (function(){}).constructor === Function );//true
console.log( ({}).constructor === Object );//true
//声明了一个构造函数,并且把它的原型指向了Array,constructor也显得力不从心
function Fn(){}
Fn.prorotype=new Array();
var f=new Fn();
console.log( f.constructor === Fn );//false
console.log( f.constructor === Array );//true
//返回结果为Boolean值

第四种 object.prototype.toString.call()
判断数据类型的一种完美解决方案

//用法及演示:
var a = Object.prototype.toString;
console.log( a.call("aaa") );//[object String]
console.log( a.call(1) );//[object Number]
console.log( a.call(true);//[object Boolean]
console.log( a.call(null) );//[object Null]
console.log( a.call(underfined) );//[object Underdined]
console.log( a.call([]) );//[object Array]
console.log( a.call(function(){}) );//[object Function]
console.log( a.call([]) );//[object Object]
//声明了一个构造函数,并且把它的原型指向了Array
function Fn(){};
Fn.prototype=new Array();
console.log( Object.prototype.toString.call(Fn) );//[object Function]
//返回的结果为数组

总结
typeof():只能判断基本数据类型,破案短引用数据类型只能返回object;
instanceofconstructor:不能很好的解决内置数据类型的判断;
instanceof“”对nullunderfined不起作用;
constructor:对array无法很好的判断
Object.prototype.toString.call():判断数据类型的一种完美解决方案

递归深拷贝

let arr = [1, 2, 3, 4, 8, 10]
Object.prototype.deepClone = function (data) {
   if (typeof (data) == 'object') {
      let deepDate = data instanceof Array ? [] : {}
      for (let key in data) {
         deepDate[key] = typeof (data[key]) == 'object' ? deepClone(data[key]) : data[key]
      }
      return deepDate
    } else {
        return data
    }
}
console.log(deepClone(arr));

本文链接: http://www.dtmao.cc/news_show_600313.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?