第一章 基础深入总结
1 数据类型
① 分类
原始类型/基础类型/值类型:
String
Number
Boolean
Null
Undefined
对象类型/引用类型
Object 基本对象
Array
Function
.....
② 类型判断
typeof
两种形式:typeof函数,typeof运算符
能判断: string、boolean、number、undefined、function
不能判断: null和除了Function的对象类型
instanceof
判断对象类型
==== 全等
两个操作数,类型和值都要相等,不会自动类型转换,区分==
判断 null和undefined
③ 相关问题
1. null和undefined的区别
undefined 代表变量没有赋值
null 代表变量赋值,只是值为null
2. 什么情况下数据类型是undefined
① 变量未赋值
② 函数的形参没有对应的实参
③ 函数没有返回值
④ 使用对象中不存在的属性
3. 什么情况下给变量赋值为null
① 定义变量,暂时不需要设置其他值,先设置为null
② 定义对象的某个属性,暂时不需要值
③ 如果一个不使用的对象,设置为null,对象会变为垃圾对象,被回收。
2 数据、变量和内存
① 什么是数据?
* 存储于内存中代表特定信息的'东东', 本质就是0101二进制
* 具有可读和可传递的基本特性
* 万物(一切)皆数据, 函数也是数据
* 程序中所有操作的目标: 数据
② 什么是变量?
变量就是可变的量
变量就是一小块内存的标识,里面存的数据
③ 什么是内存?
* 内存条通电后产生的存储空间(临时的)
* 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失
* 内存的空间是临时的, 而硬盘的空间是持久的
* 一块内存包含2个数据
* 内部存储的数据(一般数据/地址数据)
* 内存地址值数据
* 内存分类
* 栈: 全局变量, 局部变量 (空间较小)
* 堆: 对象 (空间较大)
④ 数据、变量、内存之间的关系
内存是一块存储空间,里面存数据
变量是对象这块内存标识,通过变量名可以找到这块内存,从而获取数据
⑤ 相关问题
var a = xxx, a内存中到底保存的是什么?
xxx是基本类型/原始类型
xxx是对象类型
xxx是变量
var a = 100;
//在栈里面把100这个值存下来
var a = new Date();
// 堆中开辟控件,存储对象; 栈存地址
var b = a;
// a变量的栈存的是什么, b就复制一份
3 垃圾回收机制 Garbage Collection
① 什么是垃圾?
- 一个对象没有被引用,就是垃圾对象。
② 垃圾回收
清空垃圾对象,释放内存。
JavaScript/Java/Python等: 自动垃圾回收
C/C++: 手动回收
③ 内存泄漏
垃圾对象没有被清除,导致内存空间被占用
内存空间越占越多,导致程序卡顿甚至死机
④ 垃圾回收的算法(机制)
引用计数 (IE9以及以下)
标记清除 (除了IE和新的IE)
⑤ 引用计数
- ① 对象有个引用标记
- ② 如果对对象进行了引用 +1
- ③ 取消了对象对象的引用 -1
- ④ 当引用标记=0的时候,变为垃圾对象,并删除
- 优点: 及时清除垃圾对象
- 缺点: 互相引用的对象导致内存泄漏
⑥ 标记清除
- 标记阶段:从根对象出发,每一个可以从根对象访问到的对象都会被添加一个标记,于是这个对象就被标识为可到达对象。
- 清除阶段:垃圾回收器,会对内存从头到尾进行线性遍历,如果发现有对象没有被标记为可到达对象,那么就将此对象占用的内存回收。
并且将原来标记为可到达对象的标识清除,以便进行下一次垃圾回收操作。
- 优点: 不会内存泄漏
- 缺点: 深度递归变量,定时的标记定时取清除