深入理解JS
JS的基础概念
var, let, 和 const的区别:
var、let声明变量,const声明常量,常量定义必须初始化值,不立即赋值就会报错。var声明的是一个全局作用域或函数作用域的变量,var存在变量提升的问题,使用var声明的变量会被提升到该作用域的顶部,从而有可能覆盖其他变量的属性导致错误;而let和const声明的是块级作用域的变量,不存在变量提升。- 使用
var声明的变量可以被重复声明和覆盖(第一次声明后第二次遇到就不声明了),而使用let和const声明的变量不能被重复声明(重复声明会报错)。 let声明的变量可以被重新赋值,而const声明的变量不可被重新赋值。- 在声明时未对变量进行初始化,
var和let会将变量的值赋为undefined,而const则会抛出错误。 - 在同一个作用域中,
let和const声明的变量不能与同名的变量再次声明,而var可以。
数组操作
-
pop(): 删除数组最后一项
-
push():在数组末尾插入新项
-
shift():删除数组第一项
-
unshift():在数组头部插入新项
-
splice(3,2,‘x’,’y’,’z’):从下标为3 的项开始,后面的两项被替换成xyz;没有设置新项的话,就删除那两项
-
slice(a,b):截取字数组,从下标a的项开始,到下标b的项结束(负数为倒数第几项)
-
arr = arr1.concat(arr2):合并连接数组
-
reverse():将数组中的全部项顺序置反
-
indexOf():搜索数字中的元素,并返回所在位置
-
includes():判断数组是否包含指定值,返回布尔值
-
arr.sort(function(a,b){return a-b})升序排序;arr.sort(function(a,b){return b-a})降序排序
JS是怎么执行的
- 全局执行上下文:代码开始执行时就会创建,将他压执行栈的栈底,每个生命周期只有一份
- 函数执行上下文:当执行一个函数时,这个函数内的代码会被编译,生成变量环境、语法环境等,当函数执行结束的时候执行环境从栈顶弹出。
JS的进阶知识点
垃圾回收
- JavaScript 的垃圾回收机制是自动的,它通过检测不再使用的变量来释放内存。JavaScript 实现了一种叫做 "标记清除" 的垃圾回收算法。
- 在 JavaScript 中,当一个对象不再被引用时,就会被标记为 "待清除"。这个对象的内存在下一次垃圾回收时就会被释放掉。垃圾回收器在定期间隔内周期性地执行这个过程,并且只有在进程空闲时才会运行。
- 标记清除算法通过从根部开始遍历所有对象,标记当前对象是否可达(即是否还有变量指向它),如果不可达,则将其标记为待清除。接着,垃圾回收器会清除所有标记为待清除的对象的内存空间。
- 需要注意的是,JavaScript 采用的是自动内存管理机制,因此我们并不能直接控制垃圾回收器的行为。但我们可以通过写出合理的代码和避免创建过多的全局变量等方式来帮助垃圾回收器更好地管理内存。
微任务和宏任务是JavaScript异步编程中的两个重要概念。
- 宏任务指的是由浏览器发起的任务,例如渲染事件、用户交互事件等。在JavaScript执行过程中,当遇到宏任务时会将其放入宏任务队列中,等待JavaScript主线程空闲时执行。一般来说,宏任务的执行顺序是按照它们被添加到队列中的顺序依次执行。
- 微任务则是相对于宏任务而言的,指的是由JavaScript引擎自身产生的任务,例如Promise回调函数、DOM变化观察器等。与宏任务不同的是,当JavaScript主线程执行完当前的宏任务后,就会立即执行所有可用的微任务队列,直到所有微任务都执行完成为止。因此,微任务的执行时机比宏任务更加及时。
总体来说,宏任务的优先级比微任务高,但是在JavaScript执行过程中,微任务可以插队执行,因此我们可以利用微任务来进行一些优先级较高的操作,例如状态更新或者页面的重绘。
课程总结
- JS是单线程的,但是Render进程里面有多个线程
- JS线程和GUI线程互斥,执行大的计算任务会导致页面卡顿
- 基础数据类型存在栈上,复杂数据类型存在堆上
- const、let没有变量提升机制,var有变量提升机制
- JS也有编译的过程,执行之前会生成执行上下文
- 变量环境里有一个指向外部函数执行上下文的指针,形成了作用链域
- 一个执行上下文包括变量环境、语法环境、this
- 全局执行上下文只有一份
- this和执行上下文绑定