01 对象的深/浅拷贝
1.1 变量的存储
基本类型:基本类型的值存在栈内存中
引用类型: 引用类型的地址存储在栈内存中,他的值存储在堆内存中,通过指针(地址)连接
1.2 变量拷贝
基本类型:基本类型拷贝的是值
引用类型:引用类型拷贝的是变量的地址,会造成数据共享问题
1.3 变量的传递
基本类型: 基本类型传递的是值
引用类型: 引用类型传递的是地址,会造成数据共享问题
1.4 对象的浅拷贝
方法1:Object.assign({},需要拷贝的对象)
const obj1 = Object.assign({}, obj) // Object.assign 需要传入第一个参数为空对象
方法2: for...in循环生成新的对象
let obj1 = {} // 键名 : 键值 for (const key in obj) { obj1[key] = obj[key] } console.log(obj1);
1.5 对象的深拷贝
方法1: JSON.parse(JSON.stringify(你需要拷贝的数据)) (能解决你98%的问题)
const obj1 = JSON.parse(JSON.stringify(obj))
方法2: lodash.js方法库 其中cloneDeep (能解决你100%的问题)
1.先下载 自己搜lodash官网 2.引入 <script src="./lodash.min.js"></script> 3.使用lodash方法库里面的一个叫做深克隆的方法 cloneDeep (_就代表loadsh实例对象) const obj1 = _.cloneDeep(obj) // 注意:防抖函数 、 节流函数
2.0 变量的类型检测
2.1 typeof -- 检测引用类型结果都为object
2.2 instanceof -- 检测变量是否为构造函数的实例对象
变量 instanceof 构造函数
缺陷:检测的变量是否为对象构造函数的实例时,结果都为true
2.3 Array.isArray() -- 检测是否为数组
Array.isArray('变量')
缺陷:只能检测数组
2.4 Object.prototype.toString.call() -- 检测所有的数据类型(不包括你自己的构造函数)
// 获取变量类型的最终解决方案 Object.prototype.toString const getType = Object.prototype.toString console.log(getType.call([])); console.log(getType.call({})); console.log(getType.call(new Date())); console.log(getType.call(new Error()));
课堂练习:
封装一个函数,传入你的变量,检测出类型,并且小写
3.0 ES5的继承 [背]
什么是继承?
子类继承父类的一切特征(属性和方法),子类也可以修改和追加属性和方法。
寄生组合式继承的实现方法:
1、子类继承父类的属性 : 父类.call(this,属性1,属性2)
2、子类继承父类原型上的方法 : 子类.prototype = Object.create(父类.prototype)
3、 修改子类原型对象中构造器(constructor)的指向 : 子类.prototype.constructor = 子类函数文章来源:https://www.toymoban.com/news/detail-431019.html
4、最后再子类定义或修改自己的原型方法文章来源地址https://www.toymoban.com/news/detail-431019.html
// 寄生组合继承的实现 // 创建一个父类 function Person(name, age, sex) { this.name = name this.age = age this.sex = sex } // 定义原型上的方法 Person.prototype.say = function () { console.log(`${this.name}说了什么`); } // 创建一个子类 function Student(name, age, sex, sid) { // 1、子类继承父类的属性 Person.call(this, name, age, sex) this.sid = sid } // 2、子类继承父类原型上的方法 Student.prototype = Object.create(Person.prototype) // 3、修改原型对象中构造器的指向 Student.prototype.constructor = Student // 4、子类定义或修改自己的方法 Student.prototype.run = function () { console.log(`${this.name}跑起来了`); } const s1 = new Student('张三', 18, '女', '00001') console.log(s1); s1.say() // 每一个函数都有一个原型对象 console.log(Student.prototype); // 每一个对象都有一个隐式原型,指向函数的显式原型 console.log(s1.__proto__); // 原型对象都有一个构造器(constructor) 指向函数本身 console.log(Student.prototype.constructor) // Person
到了这里,关于深浅拷贝,类型检测及继承面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!