Js面试题解析(1)

135 阅读2分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

JavaScript

1、JavaScript常用的数据类型有哪些

  • 基本数据类型(5个)
    • Number
    • String
    • Boolean
    • Null
    • undefined
    • symbol(ES6中新增)
  • 引用数据类型
    • Object
  • 两者之间的区别:在内存中的存储方式不同

1.1 类型检测方式有哪些?(总结四种)

  • typeof(最常用)
    • 使用
    typeof 'abc'
    
    • 返回字符串类型的数据名称,例:String、Number...
    • null -> object(不准确)
  • instanceof(用到的比较少)
    • 主要用于复杂数据类型中检测。
    • 任意复杂类型都是object的子类型,因此检测“数组类型”的时候,返回的是object(不准确)
  • constructor(构造器属性)
    • 原型继承可能会被覆盖(不准确)
  • Object.prototype.toString.call()(常使用)
    • 返回:[object XXX]
    • 检测“数组类型”的时候,并不会返回object Array,原因:数组“重写”了toString方法 -> 就近查找机制,没有再去原型链上找

对象的属性在使用时会沿着原型链向上查找,遵循就近原则,最终使用的功能是最近找到的

2.原始类型和对象类型有哪些区别?

  • 存放方式不同

    • 可存储的数据个数不同。
      • 存储单个值
      • 存储一组有关联的数据
    • 在内存中的存储方式不同
      • 原始值在内存单元中存储的是具体值,存储在栈中
      • 对象在内存单元中存储的是具体值的地址,存储在堆中
  • 操作时的结果不同

    • 类型检测有区别
    • 赋值操作的结果不同
      • 赋值:对变量的内存单元进行操作
      • 函数参数不同
        • 复制值
        • 引用地址

2.2

  • 所有的字符串方法必须基于返回值操作
  • 数组方法,大多数不需要基于返回值操作

3.如何拷贝对象?

  • 拷贝:顾名思义就是复制
    • **成功拷贝之后,两个文件是互不相关的,独立的两个文件。**修改一个文件中数据,另一个不会改变。
  • 对象分为:1.单纯存数据的对象,数据中没有方法(function)。2.工具对象
  • 数组如何拷贝?
    • 浅拷贝:只拷贝当前对象自身的属性(一层),对属性的属性无法实现完全拷贝。
      • 遍历 或者 内置方法 或 扩展运算符
    • 深拷贝:完全拷贝
  • 对象如何拷贝?
    • 深拷贝
      • 方式1:利用JSON对象
        // 深拷贝
        JSON.parse(JSON.stringify(obj))
        
      • 方式2:递归
        // 深拷贝:递归实现
          const obj = {
              name: '美美',
              age: 18,
              friend: {
                  gender: '女'
              }
          }
        
          const obj2 = {};
          // 深拷贝函数deepClone(source,targe);
          function deepClone(source,target){
              for(let i in source){
                  // 检测数据类型,对象类型则需要内部遍历
                  if(typeof source[i] === 'object' && source[i] !== null){
                      target[i] = source[i] instanceof Array ? [] : {};
                      deepClone(source[i],target[i]);
                  }else{
                      // 遍历赋值
                      target[i] = source[i];
                  }
              }
          }
        
          deepClone(obj,obj2);
          // 修改原对象
          obj.name = '梅子';
          obj.friend.gender = '男';
          console.log(obj,obj2);