JavaScript 数据类型、深浅拷贝

138 阅读1分钟

数据类型

基本7+1引用

Null、Undefined、Boolean

String、Number、Bigint(任意长度)

Symbol(唯一且不可改变的值,定义对象的唯一属性名)

Object(Function、Date、Array)

  • 区分数据类型取值

    eg. Boolean的值 true/false;Number的值 整数/浮点数/NaN/±Infinity

  • 在内存的位置

    栈:基本类型、对象指针(内存地址引用)

    堆:对象的值

类型判断

 适用于无法检查
typeof基本6+functionnull → object,object及派生 → object
object.prototype.toString.call所有(Error/Data),返回[Object Class]字符串 
instanceof实例原型链上是否有构造函数的.prototype基础类型
isNaNNaN为number型 

数组4

  • Array.isArray(arr)
  • instanceof Array
  • arr.proto === Array.prototype
  • obj.prototype.toString.call

拷贝

image.png image.png

  • 浅拷贝:只复制了原始对象的属性值(引用类型复制引用)
    • 遍历现有属性:for (let key in object) {clone[key] = object[key];}
    • Object.assign(dest, [src1, src2, src3...])
    • ...spread
    • concat、slice
  • 深拷贝:从内存复制真正的值,相互无影响
    • 原理:递归,对每一层克隆:if(值is对象)递归浅拷贝;else浅拷贝。
      • 轮子:lodash的_.cloneDeep(obj)
      • 手写:

参考与图片来源

如何写出一个惊艳面试官的深拷贝? - 掘金 (juejin.cn)