## 数据类型的分类和判断
* 基本(值)类型
* Number ----- 任意数值 -------- typeof
* String ----- 任意字符串 ------ typeof
* Boolean ---- true/false ----- typeof
* undefined --- undefined ----- typeof/===
* null -------- null ---------- ===
* 对象(引用)类型
* Object ----- typeof/instanceof
* Array ------ instanceof
* Function ---- typeof
var a console.log(a, typeof a, a===undefined) // undefined 'undefined' true console.log(a===type a) // false a = 3 console.log(typeof a === 'number')//true a = 'atguigu' console.log(typeof a === 'string')//true a = true console.log(typeof a === 'boolean')//true a = null console.log(a===null) // true console.log(typeof a) // 'object'
1. undefined与null的区别?
* undefined代表没有赋值
* null代表赋值了, 只是值为null
2. 什么时候给变量赋值为null呢?
* var a = null //a将指向一个对象, 但对象此时还没有确定
* a = null //让a指向的对象成为垃圾对象
3. 严格区别变量类型与数据类型?
* js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型
* 变量类型:
* 基本类型: 保存基本类型数据的变量
* 引用类型: 保存对象地址值的变量
* 数据对象
* 基本类型
* 对象类型
4. 什么是数据?
* 存储于内存中代表特定信息的'东东', 本质就是0101二进制
* 具有可读和可传递的基本特性
* 万物(一切)皆数据, 函数也是数据
* 程序中所有操作的目标: 数据
* 算术运算
* 逻辑运算
* 赋值
* 调用函数传参
5. 什么是内存?
* 内存条通电后产生的存储空间(临时的)
* 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失
* 内存的空间是临时的, 而硬盘的空间是持久的
* 一块内存包含2个数据
* 内部存储的数据(一般数据/地址数据)
* 内存地址值数据
* 内存分类
* 栈: 全局变量, 局部变量 (空间较小)
* 堆: 对象 (空间较大)
6 什么是变量? * 值可以变化的量, 由变量名与变量值组成
* 一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存的内容
7 内存,数据, 变量三者之间的关系
* 内存是一个容器, 用来存储程序运行需要操作的数据
* 变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据
8问题: var a = xxx, a内存中到底保存的是什么?
* xxx是一个基本数据
* xxx是一个对象
* xxx是一个变量
9.个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
var obj1 = {} var obj2 = obj1; obj1.age=11; function f1(obj) { obj.age = 12 } f1(obj2) console.log(obj1.age)//12
10 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)
11 在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)
12问题: JS引擎如何管理内存?
1. 内存生命周期
1). 分配需要的内存
2). 使用分配到的内存
3). 不需要时将其释放/归还
13. 释放内存
* 为执行函数分配的栈空间内存: 函数执行完自动释放
* 存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存
14. 什么是对象?
* 代表现实中的某个事物, 是该事物在编程中的抽象
* 多个数据的集合体(封装体)
* 用于保存多个数据的容器
2. 为什么要用对象?
* 便于对多个数据进行统一管理
3. 对象的组成
* 属性
* 代表现实事物的状态数据
* 由属性名和属性值组成
* 属性名都是字符串类型, 属性值是任意类型
* 方法
* 代表现实事物的行为数据
* 是特别的属性==>属性值是函数
4. 如何访问对象内部数据?
* .属性名: 编码简单, 但有时不能用
p.name
* ['属性名']: 编码麻烦, 但通用 1,
p['age']
// 访问对象内部数据 console.log(p.name, p['age'])
p['age']=23; console.log(p['name'], p.age)
5. 什么时候必须使用【‘属性名’】的方式?
1.属性名不是合法的标识名
添加一个属性: content-type: text/json
// p.content-type = 'text/json' //不正确 p['content-type'] = 'text/json'
2. 属性名不确定
var p = {} var prop = null; var value = 123 // p.prop = value //不正确 p[prop] = value console.log( p[prop])
## 数据,变量, 内存的理解============================================================
1. 什么是数据?
* 在内存中可读的, 可传递的保存了特定信息的'东东'
* 一切皆数据, 函数也是数据
* 在内存中的所有操作的目标: 数据
2 什么是变量?
* 在程序运行过程中它的值是允许改变的量
* 一个变量对应一块小内存, 它的值保存在此内存中
3 什么是内存?
* 内存条通电后产生的存储空间(临时的)
* 一块内存包含2个方面的数据
* 内部存储的数据
* 地址值数据
* 内存空间的分类
* 栈空间: 全局变量和局部变量
* 堆空间: 对象
* 内存,数据, 变量三者之间的关系
* 内存是容器, 用来存储不同数据
* 变量是内存的标识, 通过变量我们可以操作(读/写)内存中的数据
## 4 对象的理解和使用
1* 什么是对象?
* 多个数据(属性)的集合
* 用来保存多个数据(属性)的容器
2.* 属性组成:
* 属性名 : 字符串(标识)
* 属性值 : 任意类型
3* 属性的分类:
* 一般 : 属性值不是function 描述对象的状态
* 方法 : 属性值为function的属性 描述对象的行为
* 特别的对象
* 数组: 属性名是0,1,2,3之类的索引
* 函数: 可以执行的
4 * 如何操作内部属性(方法)
* .属性名
* ['属性名']: 属性名有特殊字符/属性名是一个变量
5## 函数的理解和使用
* 什么是函数?
* 用来实现特定功能的, n条语句的封装体
* 只有函数类型的数据是可以执行的, 其它的都不可以
6* 为什么要用函数?
* 提高复用性
* 便于阅读交流
* 函数也是对象
* instanceof Object===true
* 函数有属性: prototype
* 函数有方法: call()/apply()
* 可以添加新的属性/方法
7* 函数的3种不同角色
* 一般函数 : 直接调用
function showInfo (age) { alert("一般函数") } showInfo//一般函数调用
* 构造函数 : 通过new调用
var a=new showInfo(13),
* 对象 : 通过.调用内部的属性/方法
* 函数中的this
* 显式指定谁: obj.xxx()
* 通过call/apply指定谁调用: xxx.call(obj)
function show(age){ alert(this) this.name=function(){ alert(this) } this.age=10; this.age=function(age){ this.age=13; alert(this) } } // show();//window var p = new show();//指向调用它的对象p // p.name //指向调用它的对象p // p.age.call(14) //指向调用它的对象p p.age.call =show(14). 弹出14指向p function fun1() { function fun2() { console.log(this); } fun2(); //this是谁? this指向fun1() } fun1();
* 不指定谁调用: xxx() : window
function show(gae){
alert(this);
}
alert(show())//object window
* 回调函数: 看背后是通过谁来调用的: window/其它
* 匿名函数自调用:
```
(function(w, obj){
//实现代码
})(window, obj)
(function(){ alert('立即调用简称IIFE') })(Window)
```
* 专业术语为: IIFE (Immediately Invoked Function Expression) 立即调用函数表达式
* 回调函数的理解
* 什么函数才是回调函数?
* 你定义的
* 你没有调用
* 但它最终执行了(在一定条件下或某个时刻)
* 常用的回调函数
* dom事件回调函数
//1. DOM事件函数 var btn = document.getElementById('btn') btn.onclick = function () { alert(this.innerHTML) }
* 定时器回调函数
//2. 定时器函数 setInterval(function () { alert('到点啦!') }, 2000)
* ajax请求回调函数
* 生命周期回调函数