01. 数据类型
1. 分类(2大类)
* 基本(值)类型
* Number: 任意数值
* String: 任意文本
* Boolean: true/false
* undefined: undefined
* null: null
* 对象(引用)类型
* Object: 任意对象
* Array: 特别的对象类型(下标/内部数据有序)
* Function: 特别的对象类型(可执行)
2. 判断
* typeof:
* 可以区别: 数值, 字符串, 布尔值, undefined, function
* 不能区别: null与对象, 一般对象与数组
* instanceof
* 专门用来判断对象数据的类型: Object, Array与Function
* ===
* 可以判断: undefined和null
// typeof: 返回的是数据类型的字符串表达形式 //1. 基本类型 var a console.log(a, typeof a, a === undefined) // undefined 'undefined' true console.log(a === typeof a) // false a = 3 console.log(typeof a === 'number') a = 'atguigu' console.log(typeof a === 'string') a = true console.log(typeof a === 'boolean') a = null console.log(a === null) // true console.log(typeof a) // 'object' console.log('--------------------------------') //2. 对象类型 var b1 = { b2: [2, 'abc', console.log], b3: function() { console.log('b3()') } } console.log(b1 instanceof Object, typeof b1) // true 'object' console.log(b1.b2 instanceof Array, typeof b1.b2) // true 'object' console.log(b1.b3 instanceof Function, typeof b1.b3) // true 'function' console.log(typeof b1.b2[2]) // 'function' console.log(b1.b2[2]('abc')) // 'abc' undefined
1. undefined与null的区别?
* undefined代表没有赋值
* null代表赋值了, 只是值为null
2. 什么时候给变量赋值为null呢?
* var a = null //a将指向一个对象, 但对象此时还没有确定
* a = null //让a指向的对象成为垃圾对象
3. 严格区别变量类型与数据类型?
* js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型
* 变量类型:
* 基本类型: 保存基本类型数据的变量
* 引用类型: 保存对象地址值的变量
* 数据对象
* 基本类型
* 对象类型
// 1. undefined与null的区别? var a1 var a2 = null console.log(a1, a2) // 2. 什么时候给变量赋值为null呢? //初始 var a3 = null //中间 var name = 'Tom' var age = 12 a3 = { name: name, age: age } //结束 a3 = null
02. 数据、变量、内存
1. 什么是数据?
* 存储于内存中代表特定信息的'东东', 本质就是0101二进制
* 具有可读和可传递的基本特性
* 万物(一切)皆数据, 函数也是数据
* 程序中所有操作的目标: 数据
* 算术运算
* 逻辑运算
* 赋值
* 调用函数传参
...
2. 什么是内存?
* 内存条通电后产生的存储空间(临时的)
* 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失
* 内存的空间是临时的, 而硬盘的空间是持久的
* 一块内存包含2个数据
* 内部存储的数据(一般数据/地址数据)
* 内存地址值数据
* 内存分类
* 栈: 全局变量, 局部变量 (空间较小)
* 堆: 对象 (空间较大)
3. 什么是变量?
* 值可以变化的量, 由变量名与变量值组成
* 一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存的内容
4. 内存,数据, 变量三者之间的关系
* 内存是一个容器, 用来存储程序运行需要操作的数据
* 变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据
var a1 = 3 var a2 = a1 + 4 var a3 = {} a3.name = 'Tom'
问题: var a = xxx, a内存中到底保存的是什么?
* xxx是一个基本数据
* xxx是一个对象
* xxx是一个变量
var a = 3 a = function () {} var b = 'abc' a = b b = [] a = b
关于引用变量赋值问题
* 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
* 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象
//1. 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见 var obj1 = {} var obj2 = obj1 obj2.name = 'Tom' console.log(obj1.name) function f1(obj) { obj.age = 12 } f1(obj2) console.log(obj1.age) //2. 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象 var obj3 = {name: 'Tom'} var obj4 = obj3 obj3 = {name: 'JACK'} console.log(obj4.name) function f2(obj) { obj = {name: 'Bob'} } f2(obj4) console.log(obj4.name)
问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递
* 只有值传递, 没有引用传递, 传递的都是变量的值, 只是这个值可能是基本数据, 也可能是地址(引用)数据
* 如果后一种看成是引用传递, 那就值传递和引用传递都可以有
function f(a) { console.log(a) } var n = 4 f(n) //传递的是n的值 --->值传递 function f2(a) { a.name = 'atguigu' } n = {} f2(n) // 传递的是n指向的对象 ---> 引用传递 ??? console.log(n.name)
问题: JS引擎如何管理内存?
1. 内存生命周期
1). 分配需要的内存
2). 使用分配到的内存
3). 不需要时将其释放/归还
2. 释放内存
* 为执