1 JS的基本概念
浏览器就是多进程的,每打开的一个浏览器窗口就是一个进程,进程是cpu资源分配的最小单位,进程可以包含多个线程。
渲染进程主要包括:GUI线程(绘制页面内容),JS线程(执行js),事件触发线程,定时器触发线程,网络线程等
js为单线程,与GUI线程互斥;js是动态弱类型语言(声明变量时不需要指定类型);面向对象(不是纯面向对象),函数式(参数指向结果);js安全(附属环境是浏览器,不能访问本地的系统),性能差。
1.1 数据类型
复杂数据类型与基本数据类型的区别:
1.复杂数据类型赋值的是地址,基础数据类型赋值的是原始的值
2.复杂的数据类型原始的值是可以被改变的,基础数据类型是不可以被改变的
两种类型的区别在于存储位置的不同:
原始数据类型直接存储在栈(stack) 中的简单数据段,占据空间小、大小固定,属于被频繁使用数据,所以放入栈
中存储;引用数据类型存储在堆(heap) 中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行
的性能,引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索
其在栈中的地址,取得地址后从堆中获得实体.堆和栈的概念存在于数据结构和操作系统内存中,在数据结构中!在数
据结构中,栈中数据的存取方式为先进后出。堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来
规定。在操作系统中,内存被分为栈区和堆区:栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值
等。其操作方式类似于数据结构中的栈。堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾
回收机制回收.
typeof null 的结果是什么,为什么?
typeof null 的结果是Object。
在JavaScript 第一个版本中,所有值都存储在 32 位的单元中,每个单元包含一个小的 类型标签(1-3 bits) 以
及当前要存储值的真实数据。类型标签存储在每个单元的低位中,共有五种数据类型:
JavaScript当前存储的数据指向一个对象。@e: object int当前存储的数据是一个 31 位的有符号整数21:m010:
double当前存储的数据指向一个双精度的浮点数。string当前存储的数据指向一个字符串.100:当前存储的数据是布
尔值。110: boolean,如果最低位是 1,则类型标签标志位的长度只有一位,如果最低位是 0,则类型标签标志位
的长度占三位,为存储其他四种数据类型提供了额外两个 bit 的长度,有两种特殊数据类型:
。undefined的值是(-2)30一个超出整数范围的数字);
。null 的值是机器码 NULL 指针(null 指针的值全是 0
那也就是说null的类型标签也是000,和Obiect的类型标签一样,所以会被判定为obiect.
1.2 作用域 ES6之前只有两种:全局作用域和函数作用域,除此之外还有一个块级作用域
块级作用域第二个log输出报错。
1.2 变量提升 var和函数有变量提升(先把没赋值的var提到前面去;函数是把整个函数都提到前面去,但不能赋值给变量如下图所示),let和const没有变量提升
2 JS如何执行
重点:执行上下文
创建执行上下文时,绑定了This,创建了词法环境,创建变量环境
词法环境放函数,let,const定义的变量,变量环境放var
Outer指向外部变量环境的一个指针
一层一层往外找时形成作用域链
改的堆空间里的内容,地址不变
3 js进阶
3.1闭包
showName即使执行完,但是里面闭包的内容是没有被回收的
3.2 This 普通函数里的this指向的是window(包括嵌套)
改变this指向可以用apply,call,bind等
先赋值再调用,看调用的地方
3.2 垃圾回收
栈的垃圾回收:ESP指针弹到下一个,上面就变成无效的内存,分配时就被覆盖掉了
堆的垃圾回收:
(1)新生代空间(副垃圾回收器)
在对象区域(活跃的对象和变量),先作垃圾标记,标记后将活跃的对象和变量复制到空闲区域去,再将区域翻转,再将翻转后的空闲区域清掉,即完成一次垃圾回收
(2)老生代空间(主垃圾回收器)
老生代空间比较大;将新生代回收后还没被回收掉的垃圾放到老生代中
先内存标记,标记之后清除,再做内存整理
全停顿:标记清理到清除后的状态的停顿,即耗时非常长,所以主垃圾回收器就会把债务分成碎片任务
3.3 js事件循环
先微任务,再宏任务;即先执行一个宏任务中的微任务,微任务执行完之后再执行那个宏任务。
4 课程总结