课程名称:《一天时间迅速准备前端面试 快速构建初级前端知识体系》
章节名称(序号):第4章 JS基础-变量类型和计算
讲师:双越
章节课程内容:手写 JS 深拷贝、变量计算
学习心得:
1、类型守卫
typeof 作用
typeof 用来检测一个变量或一个对象的数据类型
typeof 检测的范围
typeof 检测变量的类型范围包括: “string”|“number”| " bigint" | "boolean" | "symbol" | "undefined" | "object" | "function" 等数据类型。
typeof 的局限性
typeof 检测变量并不完全准确,例如 typeof null 结果为object
typeof 的替代方案
Object.prototype.toString.call
Object.prototype.toString.call([]) 展示[object Array]
Object.prototype.toString.call(null) 展示[ object null ]
Object.prototype.toString.call(Set类型的变量) 展示[ object Set ]
Object.prototype.toString.call(Map类型的变量) 展示[ object Map ]
typeof 的替代方案依然无法解决的问题instanceof
就是无法获取一个自定义的类的实例变量或构造函数的对象变量的真正创建类型,答案是使用 instanceof 来解决。
instanceof 的主要作用: instanceof 帮助我们准确的判断一种自定义函数或类创建的对象变量的数据类型。
instanceof 执行后 返回 true 的几种条件【符合一个即可】:
(1) 对象变量.__proto__=类名或函数名.prototype。
解释1:如果 instanceof 关键字 左边对象变量的 __proto__ 属性指向的原型对象空间=右边类名或函数名的 prototype 对象属性指向的原型对象空间,那么 返回 true。
(2) 对象变量.__proto__.__proto__...._proto__=类名或函数名.prototype。
解释2: instanceof 左边对象变量 __proto__的1到多个上一级__proto__指向的原型对象空间,等于右边类名或函数名的 prototype 对象属性指向的原型对象空间,那么也返回 true,按照这个查找规律,会一直找到Object.prototype 对象属性指向的原型对象空间为止。
2、深拷贝
function deepClone(obj = {}){ if( typeof !== 'object' || obj == null) { return obj } let result if(obj instanceof Array) { result = [] } else { result = {} } for(let key in obj) { if(obj.hasOwnProperty(key)){ //递归 result[key] = deepClone(obj[key]) } } return result }