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

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

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

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

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

相关文章

  • 浅析深浅拷贝

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

    2024年02月12日
    浏览(32)
  • 深浅拷贝、函数

    普通函数 1、函数的定义与特性 2、函数的创建 3、函数的参数 4、函数的返回值 5、可变与不可变数据类型 6、作用域 递归函数 匿名函数 高级函数 装饰器 1、闭包 2、装饰器 3、装饰器之登录练习 列表生成式 1、列表推导式的概念 2、基本的使用方式 3、在循环的过程中使用i

    2024年02月03日
    浏览(34)
  • 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日
    浏览(35)
  • C# List 复制之深浅拷贝

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

    2024年02月07日
    浏览(57)
  • JavaScript深浅拷贝的几种方式

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

    2024年01月19日
    浏览(51)
  • 【C++】string类的深浅拷贝问题

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

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

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

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

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

    2024年02月13日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包