js基础-数据类型及相关判断

178 阅读2分钟

一.有哪些数据类型

  • 原始数据类型:string number boolean null undefined Symbol
  • 引用数据类型:Object,Function,Array,String,Number,Boolean,Date,Mate,RegExp等

区别:

  • 原始数据类型:存储在栈(函数调用栈)中,先进后出,占空间小,大小固定
  • 引用数据类型:存储在堆中,占空间大,大小不定(引用类型在栈中存储指针,指向堆中堆实体起始位置)

二.常用判断数据类型方法(typeof,instanceof,constructor,Object.prototype.toString.call)

方法/数据类型 原始数据类型 引用数据类型 自定义类型
typeof null判断为object function能判断,其它均判断为object
instanceof x
constructor null和undefined不能判断
Object.prototype.toString.call x

例子:

[] instanceof Array和[] instanceof Object 均为true

三.其它常见场景

1.判断对象是否为空
  • 将对象转换成json字符串
      console.log(JSON.stringfy(obj) === '{}') //true表示为空
    
  • for in循环判断
      for (let key in obj) {
          return false;
      }
      return true; // 空
    
  • object.getOwnPropertyNames
      let arr = Object.getOwnPropertyNames(obj);
      console.log(arr.length) // 为0时表示空
    
  • ES6的object.keys(原理同上)
      let arr = Object.keys(obj)
      console.log(arr.length) // 为0时表示空
    
2.深浅拷贝

js不允许直接操作内存中的地址,所以对象的操作都只是对它对引用操作,只有当要复制的对象的所有属性都不是引用类型时,可以使用浅拷贝

  • 浅拷贝
    1. js内部函数object.assign 深拷贝第一层
      object.assign(newObj, oldObj) //第一个参数为新对象,第二个为被拷贝的原对象
    
    1. 遍历赋值
      function shallowCopy(obj) {
          let copy = {};
          for(let key in obj) {
              if(obj.hasOwnProperty(key)) {
                  copy[key] = obj[key]
              }
          }
          return copy;
      }
    
    1. array.slice()可以视为数组的浅拷贝
  • 深拷贝
    1. 遍历 想了想还是看看大神的吧,juejin.cn/post/684490…

    2. JSON转换

    JSON.parse(JSON.stringfy(obj)) // 只支持基础类型、数组和对象,不支持变量、函数和对象实例,原型链会丢失
    
    1. lodash
    lodash _.baseClone()
    
    1. jQuery
    jQuery.extend()