原始类型
- undefined
- boolean
- number
- string
- null
- bigInt
- Symbol
栈
- 存储位置不同
- 先进后出
- 占据空间小、大小固定,属于被频繁使用数据
- 编译器自动分配释放

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

栈和堆
内存分配
- 值直接存储在变量访问的位置
- 存储在变量处的值是一个指针(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) {
return false;
}
return true;
}
function checkNullObj(obj) {
if (typeof obj !== "object") {
return false;
}
if (JSON.stringify(obj) === "{}") {
return true;
}
return false;
}
function checkNullObj(obj) {
if (typeof obj !== "object") {
return false;
}
return (
Object.keys(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0
);
}