1.基础总结深入
a)数据类型
i.分类
1.基本(值)类型
a)Number:任意数值
b)String:任意文本
c)Boolean:true/false
d)Underfined:underfined
e)Null:null
2.对象(引用类型)
a)Object:任意对象
b)Array:特别的对象类型(下标/内部数据有序)
c)Function:特别的对象类型(可执行)
ii.判断
1.Typeof:
a)可以区别: 数值, 字符串, 布尔值, undefined, function
b)不能区别: null与对象, 一般对象与数组
2.Instanceof
a)专门用来判断对象数据的类型: Object, Array与Function
3.===
可以判断: undefined和null
iii.相关问题
1.undefined与null的区别?
a)undefined代表变量没有赋值
b)null:代表变量赋值了, 只是值为null
2.什么时候将变量赋值
a)初始化赋值: 将要作为引用变量使用, 但对象还没有确定
b)结束时: 将变量指向的对象成为垃圾对象
3.理解变量类型和数据类型
a)js的变量本身是没有类型的, 变量的类型实际上是变量内存中数据的类型
变量类型:
基本类型:保存基本类型数据的变量
引用类型:保存对象地址值的变量
值的变量:
数据对象:基本类型和对象类型
b)数据,变量与内存
i.什么是数据
存储于内存中代表特定信息的'东东', 本质就是0101二进制,具有可读和可传递的基本特性万物(一切)皆数据, 函数也是数据
程序中所有操作的目标: 数据(算术运算,逻辑运算,赋值,调用函数传参)
ii.什么是内存
内存条通电后产生的存储空间(临时的)产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失
内存的空间是临时的, 而硬盘的空间是持久的
分配内存: 声明变量和函数或创建对象时, JS引擎会自动为此分配一定大小的内存来存放对应的数据
释放内存: 清空内存中的数据, 标识内存可以再分配使用(内存不释放就不能复用)
自动释放: 栈空间的局部变量
垃圾回调器回调: 堆空间的垃圾对象
一块内存包含2个数据
内部存储的数据(一般数据/地址数据)
内存分类:
栈:全局变量,局部变量(空间较小)
堆:对象(空间较大)
iii.什么是变量
*值可以变化的量, 由变量名与变量值组成
*一个变量对应一块小内存, 变量名用来查找到内存, 变量值就是内存中保存的内容
iv.内存,数据,变量三者之间的关系
*内存是一个容器, 用来存储程序运行需要操作的数据
*变量是内存的标识, 我们通过变量找到对应的内存, 进而操作(读/写)内存中的数据
相关问题:
1.问题1: var a = xxx, a内存中到底保存的是什么?
* xxx是一个基本数据
* xxx是一个对象
* xxx是一个变量
2.关于引用变量赋值问题
* 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见
* 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象
3.问题: 在js调用函数时传递变量参数时, 是值传递还是引用传递?
*只有值传递, 没有引用传递, 传递的都是变量的值,只是这个值可能是基本数据, 也可能是地址(引用)数据
*如果后一种看成是引用传递, 那就值传递和引用传递都可以有
4.问题: JS引擎如何管理内存?
1.内存生命周期
1).分配需要的内存
2).使用分配到的内存
3).不需要时将其释放/归还
2.释放内存
*为执行函数分配的栈空间内存: 函数执行完自动释放
*存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存
c)对象
1.什么是对象?
*代表现实中的某个事物, 是该事物在编程中的抽象
*多个数据的集合体(封装体)
*用于保存多个数据的容器
2.为什么要用对象?
*便于对多个数据进行统一管理
3.对象的组成
*属性
*代表现实事物的状态数据
*由属性名和属性值组成
*属性名都是字符串类型, 属性值是任意类型
*方法
*代表现实事物的行为数据
*是特别的属性==>属性值是函数
//创建对象
var p = {
name: 'Tom',
age: 12,
setName:function (name) {
this.name =name
},
setAge:function (age) {
this.age =age
}
}
//访问对象内部数据
console.log(p.name, p['age']);
p.setName('Jack')
console.log(p['name'], p.age);
4.如何访问对象内部数据?
* .属性名: 编码简单, 但有时不能用
* ['属性名']: 编码麻烦, 但通用
什么时候必须使用['属性名']的方式访问对象内部数据?
*属性名不是合法的标识名
*属性名不确定
var p = {}
/*情形一: 属性名不是合法的标识名*/
/*需求: 添加一个属性: content-type: text/json */
// p.content-type = 'text/json' //不正确
p['content-type']= 'text/json'
/*情形二: 属性名不确定*/
var prop = 'xxx'
var value = 123
// p.prop =value //不正确
p[prop] = value
console.log(p['content-type'], p[prop])
d)函数
1.什么是函数?
*具有特定功能的n条语句的封装体
*只有函数是可执行的, 其它类型的数据是不可执行的
*函数也是对象
2.为什么要用函数?
*提高代码复用
*便于阅读和交流
3.如何定义函数?
*函数声明
function f1 () { //函数声明
console.log('f1()')
}
*表达式
var f2 = function () { //表达式
console.log('f2()')
}
4.调用(执行)函数
* test()
* new test()
* obj.test()
*test.call/apply(obj)
5.回调函数
1.什么函数才是回调函数?
*你定义的
*你没有直接调用
*但最终它执行了(在特定条件或时刻)
2.常见的回调函数?
* DOM事件函数
*定时器函数
* ajax回调函数(后面学)
*生命周期回调函数(后面学)
6.IIEF
1.理解
*全称: Immediately-Invoked Function Expression 立即调用函数表达式
*别名: 匿名函数自调用
2.作用
*隐藏内部实现
*不污染外部命名空间
(function(i) {
vara=4
functionfn() {
console.log('fn ', i+a)
}
fn()
})(3)
7.补充
领取专属 10元无门槛券
私享最新 技术干货