学习一 JS事件循环
JavaScript语言的一大特点就是单线程。单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。JavaScript语言的设计者意识到,这时主线程完全可以挂起处于等待中的任务,先运行排在后面的任务。等到主线程任务返回了结果,再回过头,把挂起的任务继续执行下去。于是就有了同步任务和异步任务。
同步任务和异步任务
同步任务指的是,在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务;
异步任务指的是,不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
"任务队列 "中的事件,除了IO设备的事件以外,还包括一些用户产生的事件(比如鼠标点击、页面滚动等等)。只要指定过回调函数,这些事件发生时就会进入"任务队列",等待主线程读取。一旦主线程("执行栈")中的所有同步任务执行完毕,系统就会读取"任务队列看里面有哪些事件。于是那些对应的异步任务结束等待状态,进入执行栈,开始执行。
执行栈中的代码(同步任务),总是在读取"任务队列"(异步任务)之前执行。
上图中,主线程运行的时候,产生堆(heap)和栈(stack),栈中的代码调用各种外部API,它们在"任务队列"中加入各种事件(click,load,done)。只要栈中的代码执行完毕,主线程就会去读取"任务队列",依次执行那些事件所对应的回调函数。
Node.js的Event Loop
Node.js还提供了另外两个与"任务队列"有关的方法process.nextTick和setImmediate。它们可以帮助我们加深对"任务队列"的理解。
process.nextTick方法可以在当前"执行栈"的尾部----下一次Event Loop(主线程读取"任务队列")之前----触发回调函数。也就是说,它指定的任务总是发生在所有异步任务之前。
setImmediate方法则是在当前"任务队列"的尾部添加事件,也就是说,它指定的任务总是在下一次Event Loop时执行,这与setTimeout(fn, 0)很像。
由于process.nextTick方法指定的回调函数,总是在当前"执行栈"的尾部触发,setImmediate总是将事件注册到下一轮Event Loop,所以多个process.nextTick语句总是在当前"执行栈"一次执行完,多个setImmediate可能则需要多次loop才能执行完。
另外,很显然,前者总是比后者发生得早,而且执行效率也高(因为不用检查"任务队列")。
参考自事件循环(阮一峰)
学习二 Vue.nextTick
- 用法:
在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法,获取更新后的 DOM。
Vue 实现响应式并不是数据发生变化之后 DOM 立即变化,而是更新data的数据后,DOM进行异步更新。即等同一事件循环中的所有数据变化完成之后,再统一进行视图更新。
//当组件根据最新的data数据,重新在视图上完成渲染后,在执行里面的函调函数
this.$nextTick(()=>{
this.$refs.inputRef.focus();
})
流程如下
同步代码执行 -> 查找异步队列,推入执行栈,执行Vue.nextTick[事件循环1] ->查找异步队列,推入执行栈,执行Vue.nextTick[事件循环2]...
学习三 JSON.parse() 和 JSON.stringify()
JSON.parse() 和 JSON.stringify() 是 JavaScript 中用于处理 JSON 格式数据的两个核心方法。
JSON.parse(): 用于将 JSON 字符串解析为 JavaScript 对象。
JSON.stringify(): 用于将 JavaScript 对象转换为 JSON 字符串。
使用场景
-
数据传输: 在客户端和服务器之间传输数据时,通常会使用 JSON 格式。你可以使用 JSON.stringify() 将 JavaScript 对象转换为 JSON 字符串,然后通过网络发送到服务器,服务器收到后再使用 JSON.parse() 将 JSON 字符串解析为 JavaScript 对象。
-
存储数据: 当需要将 JavaScript 对象保存到本地存储(如浏览器的本地存储或数据库)时,通常需要将其转换为 JSON 格式。这样做可以确保数据的序列化和反序列化过程安全可靠。
-
与其他系统交互: 当与其他系统进行交互时,如果它们使用的是 JSON 格式作为数据交换的标准,你需要将 JavaScript 对象转换为 JSON 字符串进行发送,并在接收到数据后将 JSON 字符串解析为 JavaScript 对象。