数据类型:1 2 3(7种)
1基本数据类型(值类型): string number boolean null undefined
2引用数据类型 object: {} [] // 日期对象 Math 实例对象.... ; function
3ES6中新增 :Symbol 唯一值
number:解析
// typeof 检测数据类型 typeof NaN === // 'number'
// isNaN() 把其他数据类型转化为number类型失败时,返回 NaN;isNaN()用Number()作隐式转换
object:解析(对象的属性名一定不能是引用类型值,默认可以把引用类型值转化为字符串进行处理===>toString())
let obj = {
0:100,
true:'珠峰',
{0:1000}:1000 //这里有语法错误,但是换种方式就能加上,说明属性名可以是引用类型(隐式转换为字符串)
}
let a = {0:1000} obj[a] = 1000; 这样 打印obj时 {0:1000,true:‘珠峰’, [object object]:1000};说明对象的属性可以是基本类型值,但是若有引用类型则会隐式转化为 字符串;
###数组:解析(数组与对象的关系:数组是特殊的对象;因为数组也是键值对,也有length属性)
堆(heap)和栈(stack)
编译器(意义:把代码解析成为浏览器看的懂的结构) :词法解析=》AST抽象语法树=》构建出浏览器能够执行的代码
引擎(V8 / webkit 内核)变量提升、作用域、闭包、变量对象、堆栈内存、GO/VO/AO/EC/ECStack
引擎执行代码就需要创建一个执行环境栈ECS,(本质:栈内存:1执行代码,2存储基本类型值);为了执行代码,还需要创建当下代码的EC(执行环境);(EC:执行上下文,某个域下的代码执行都有自己的执行上下文,例如全局上下文:EC(G)global;函数:EC(...))
执行代码前,把创建的上下文压缩到栈中执行=》进栈
代码执行完,有的上下文就没用了=》出栈 ;
代码执行完,有的上下文有用,会把其压到栈底=》闭包;
GO全局对象:global object 在浏览器端(不是node),会把全局对象赋值给window
var a = 12 ;变量赋值的三部操作:1创建变量(声明 declare);2创建值:基本值直接在栈中创建和存储即可(由于引用值是复杂的结构,所以特殊处理--》a开辟一个存储对象中键值对(或存储函数中代码)的内存空间:“堆内存”;b所有的堆内存都有一个可被后续查找的16进制地址;c后续关联赋值的时候,是把堆内存地址给予变量操作的);3让变量和值关联起来(赋值:定义 defined)
x = y = [1,23] 步骤:创建一个数组(地址) x = 地址 y= 地址
注意:let在全局声明的变量是全局变量,但不是全局属性,所以不放在GO里面,直接放在EC(G)里面;
声明一个函数时,会开辟一个堆内存,那么在这个堆内存里面,都有哪些东西?
答:2类东西:A代码字符串,所有执行代码都是以字符串形式存在;B键值对:比如length(代表了形参个数;name(代表了函数名称)。。。。。
***函数创建总结:
**1函数创建的时候:1.开辟一个堆(存储代码字符串和对应的键值对)2.初始化了当前函数的作用域([[ scope ]] = 所在上下文EC中的变量对象VO/AO)
**2函数执行的时候:1.创建了一个新的执行上下文EC(压缩到栈ECStack里边)2.初始化this指向3.初始化作用域链[[ scopeChain ]] : xxx 4.创建AO变量对象用来存储变量(=》arguments =>形参 =》代码执行)
注意:全局执行执行上下文里,存放变量的对象是VO(变量对象);函数的执行上下文里,存放变量的对象是AO(活动对象);这两种对象都是变量对象。只是全局级别,和函数级别的区别。同时VO/AO不同于GO,前者是变量对象后者是全局对象,浏览器中指window,
接下来执行函数:1.每一个函数执行都会形成一个全新的执行上下文,然后,执行上下文里有着活动对象AO。2.执行函数时第一步是初始化实参集合arguments,第二步是创建形参变量并且赋值,第三步是代码执行。(注意:非严格模式下,实参集合和形参变量之间会建立映射机制,严格模式下不会,而且ES6箭头函数中没有arguments实参集合)
注意:自执行函数的执行(两步:创建+执行)
注意:优先级:逻辑与&& 高于 逻辑|| (逻辑或||应用场景:function(x){ x = x || 0;当x没有传值时,默认值为0})
注意:执行上下文里面,所有在变量对象里的变量都是私有的,比如在AO中的:1.形参2.在这里声明的变量
垃圾回收机制:
***谷歌浏览器的垃圾回收机制(内存释放机制):浏览器会在空闲的时候把所有不被占用的堆内存,进行释放和销毁。(谷歌的垃圾回收是:内置的随时检测有没有被占用的机制)
***IE浏览器的垃圾回收机制:当前堆被占用一次,会计数1,再被占用一次,数字累加。当前取消占用,数字减去一,一直减到0则销毁。(IE的垃圾回收是计数机制,缺点:记着记着可能记错了,会导致内存泄露,比如循环嵌套引用)
####作业:内存泄露怎么来的?(参考:《红宝书》)
###作业:学习 对象和数组方法 Object.prototype / dir(Object) ; Array.prototype / dir(Array)
网友评论