JavaScript 系列 - 数据类型

98 阅读2分钟

原始类型

  • undefined
  • boolean
  • number
  • string
  • null
  • bigInt
  • Symbol

  • 存储位置不同
  • 先进后出
  • 占据空间小、大小固定,属于被频繁使用数据
  • 编译器自动分配释放

栈.dib

复杂数据类型

Objecttypeof instance === "object"

  • 占据空间大、大小不固定
  • 指针指向堆中该实体的起始地址
  • 先检索其在栈中的地址,取得地址后从堆中获得实体
  • 优先队列,是按优先级来进行排序
  • 垃圾回收机制回收
  • 完全二叉树

堆.dib

栈和堆

内存分配

  • 值直接存储在变量访问的位置
  • 存储在变量处的值是一个指针(point),指向存储对象的内存地址

访问机制

  • 直接访问
  • 引用访问

复制变量

  • 原始值的副本赋值给新变量
  • 内存地址赋值给新变量

参数传递

  • 变量里的值传递给参数
  • 内存地址

基本规范

  • 一个函数作用域中所有的变量声明应该尽量提到函数首部
  • 不允许出现两个连续的 var 声明
  • 变量没有值,应该给该变量赋值对应类型的初始值
  • 代码中出现地址、时间等字符串时需要使用常量代替
  • 在进行比较的时候吧,尽量使用'===', '!=='代替'==', '!='
  • 不要在内置对象的原型上添加方法,如 Array, Date
  • switch 语句必须带有 default 分支
  • for 循环必须使用大括号
  • if 语句必须使用大括号

类型判断

function getType(value) {
  let valueClass = Object.prototype.toString.call(value),
    type = valueClass.split(" ")[1].split("");
  type.pop();
  return type.join("").toLowerCase();
}

判断是否为空对象

function checkNullObj(obj) {
  if (typeof obj !== "object") {
    return false;
  }
  for (var i in obj) {
    // 如果不为空,则会执行到这一步,返回true
    return false;
  }
  return true; // 如果为空,返回false
}
function checkNullObj(obj) {
  if (typeof obj !== "object") {
    return false;
  }
  if (JSON.stringify(obj) === "{}") {
    return true; // 如果为空,返回false
  }
  return false; // 如果不为空,则会执行到这一步,返回true
}
function checkNullObj(obj) {
  if (typeof obj !== "object") {
    return false;
  }
  return (
    Object.keys(obj).length === 0 &&
    Object.getOwnPropertySymbols(obj).length === 0
  );
}