zoukankan      html  css  js  c++  java
  • JavaScript面试题总结系列(二)

    2. JavaScript对象

    2.1 内置对象

    • Object是JavaScript中所有对象的父对象;
    • 数据封装类对象:Object、Array、Boolean、Number、String;
    • 其他对象:Function、Arguments、Math、Date、RegExp、Error、JSON、全局对象;

    2.2 定义对象的方式

    • 对象字面量: var obj = {};
    • 构造函数: var obj = new Object();
    • Object.create(); var obj = Object.create(Object.prototype);

    2.3 通过new的方式和通过字面量的方式创建对象区别

    • 通过字面量的方式创建对象,不会调用Object()构造函数,简介并且性能更好;
    • 通过new操作符创建对象时,需要调用Object()构造函数,本质上是方法调用,涉及到在__proto__链中遍历该方法,当找到方法后,会产生调用方法必须的堆栈信息,方法结束后,需要释放堆栈,在性能上不如使用字面量的方式创建对象。

    2.4 如何判断两个对象相等

    可以转换为字符串来判断。举例:

    obj = {
        a: 1,
        b: 2
    }
    obj2 = {
        a: 1,
        b: 2
    }
    obj3 = {
        a: 1,
        b: '2'
    }
    
    JSON.stringify(obj) == JSON.stringify(obj2);//true
    JSON.stringify(obj) == JSON.stringify(obj3);//false
    

    2.5 new操作符

    在调用 new 操作符的过程中,执行了以下四个步骤:

    1. 新生成一个对象;
    2. 链接到原型:
    let obj = new Object();
    let Con = [].shift.call(arguments);
    obj.__proto__ = Con.prototype
    
    1. 绑定 this: apply;
    2. 返回新对象;

    用一句话来说就是:

    new 操作符新建了一个空对象,这个对象原型指向构造函数的prototype,执行构造函数后返回这个对象。

    2.6 浅拷贝和深拷贝

    • 什么是浅拷贝,什么是深拷贝?
      浅拷贝和深拷贝,这里通常是指将一个对象A赋值给另一个变量B。当A修改的时候,如果B也跟着变化,这个就是浅拷贝,如果B没有变化,这个叫做深拷贝。
    • 浅拷贝可以如何实现
      可以通过直接将对象赋值给变量的方式实现浅拷贝。举例:
    let a = [1, 2, 3];
    let b = a;
    a[0] = 4;
    b[0] // 4
    
    • 深拷贝可以如何实现
      1.Object.assign(); 看个例子:
    let a = {
        age: 1
    }
    let b = Object.assign({}, a)
    a.age = 2
    console.log(b.age) // 1
    

    2.展开运算符。举例:

    let a = {
        age: 1
    }
    let b = {...a}
    a.age = 2
    console.log(b.age) // 1
    
    1. JSON方法:

    主要是通过JSON.parse()和JSON.stringify()的搭配来实现深拷贝。举例:

    let a = {
      age: 1,
      jobs: {
        first: 'FE'
      }
    }
    let b = JSON.parse(JSON.stringify(a))
    a.jobs.first = 'native'
    console.log(b.jobs.first) // FE
    
    1. jQuery的extend()方法
      由于现在项目中用jQuery相对较少,用到的时候可以单独去查该API。
    2. 递归
      这个主要是针对对象的元素不是一维元素,元素本身可能也为对象或者数组,甚至子元素的子元素也是对象或者数组的时候,从根本上去实现深拷贝。
  • 相关阅读:
    微服务2.0时代,论其痛点与触点
    微服务架构的中国式落地
    【干货】微服务技术栈选型手册2.0
    每位开发者都该看:如何在四十岁后还能继续从事软件开发?
    在IBM学到的东西,到底对我的程序生涯产生了多大的影响
    十年程序员老兵告诉你,2018年程序员如何发展
    IntelliJ IDEA 快捷键大全
    List<Integer>.remove()的一个小细节
    eclipse 设置 @author @version等注释模板
    Android 获取当前应用的版本号和当前系统的版本号
  • 原文地址:https://www.cnblogs.com/zxxsteven/p/11719906.html
Copyright © 2011-2022 走看看