深浅拷贝,类型检测及继承面试题

这篇具有很好参考价值的文章主要介绍了深浅拷贝,类型检测及继承面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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 = 子类函数

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模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深浅拷贝,温故知新

    1.1、概念 对象的深拷贝是指其属性与其拷贝的源对象的属性不共享相同的引用(指向相同的底层值)的副本。 因此,当你更改源或副本时,可以确保不会导致其他对象也发生更改;也就是说,你不会无意中对源或副本造成意料之外的更改。 在深拷贝中,源和副本是完全独立

    2024年02月03日
    浏览(43)
  • 浅析深浅拷贝

           我们在对对象进行复制时就用到深浅拷贝。 一、普通复制 控制台打印结果:               之所以我们要用到拷贝,是因为直接赋值的复制可能不能满足我们的需求。向上面代码所展示的,我们复制代码时,复制到的是 地址 ,所以对 复制体修改实际修改的是原对

    2024年02月12日
    浏览(31)
  • JavaScript深浅拷贝

    1. js浅拷贝只是创建了一个新的对象,复制了原有对象的基本类型的值。 手写实现  2. 深拷贝的原理和实现 将一个对象从内存中完整地拷贝出来一份给目标对象,并从堆内存中开辟一个全新的空间存放新的对象,且新对象的修改并不会改变原对象,二者实现真正的分离

    2024年01月18日
    浏览(40)
  • python的深浅拷贝

    copy函数是浅拷贝,只对可变类型的第一层对象进行拷贝,对拷贝的对象开辟新的内存空间进行存储,不会拷贝对象内部的子对象。对于不可变对象而言,浅拷贝只是引用赋值。 deepcopy函数是深拷贝,对于可变类型,深拷贝是逐层进行拷贝。对于不可变类型而言,也是引用赋值

    2024年02月12日
    浏览(32)
  • 认识Object类和深浅拷贝

    本文介绍了Object类以及Object类部分方法,toString方法,equals和hashCode方法(重写前和重写后的对比),getClass方法,clone方法,以及拷贝新对象时会出现的深浅拷贝, 内容较长,耗时一天,建议收藏后观看~ Object类是Java默认提供的一个类。而这个类是Java里所有类的顶级父类,即在继承体系下

    2023年04月20日
    浏览(34)
  • C# List 复制之深浅拷贝

    声明类 执行上述方法, 修改list1 中的属性值, 发现list2 的属性值会跟着变化, list3 的属性值不发生变化; 由于进行的是浅拷贝,所以直接将list1的内容复制给了list2,虽然list1和list2所在的地址不一样,但是两个list存储的对象仍然是相同的(因为把list1复制到list2时,浅拷贝复制的

    2024年02月07日
    浏览(52)
  • 【C++】string类的深浅拷贝问题

    我们知道,定义一个类的时候,如果我们没有写构造,拷贝构造,赋值运算符重载,析构方法的话,编译器会自动生成。当该类成员中涉及到资源的管理时,实现的就是浅拷贝。所以,以上这几种方式是必须要程序猿手动实现的。 举例来看: 图中所示:实现了构造和析构,

    2023年04月26日
    浏览(40)
  • JavaScript深浅拷贝的几种方式

    深浅拷贝主要是针对于引用类型而言的 1. JSON.parse(JSON.strigify(Str)) JSON.stringify() 该方法用于将一个字转换为JSON字符串,该字符串符合JSON格式,并且可以被JSON.parse()方法还原。 对于原始类型的字符串,转换结果会带双引号 如果要转换的对象的属性是undefined,函数或xml对象,该

    2024年01月19日
    浏览(49)
  • 【C++】vector类的模拟实现(增删查改,拷贝构造,赋值运算,深浅拷贝)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们模拟vector是用迭代器(start,end,endofstorage)来控制增删查改操作的 1普通构造 2迭代器构造 3初始化字符构造 4拷贝构造: 1当前大小(size()) 2总体容量(capacity()) 1begin()

    2024年02月15日
    浏览(59)
  • 【C++入门到精通】C++入门 —— 深浅拷贝函数

    目录 拷贝函数 浅拷贝拷贝构造函数 深拷贝拷贝构造函数 总结         前面我们学习了C++的一些基本的知识点,并且介绍了一些STL里面String的一些关键操作,除了这些博主还新开了一个专栏关于Linux的讲解(Linux专栏链接)大家可以关注一下,后面我会一点一点的更新的。大

    2024年02月13日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包