持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第16天,点击查看活动详情。
变量的类型转换的分类
类型转换分为两种:显示类型转换、隐式类型转换。
显示类型转换
- toString()
- String()
- Number()
- parseInt(string)
- parseFloat(string)
- Boolean()
隐式类型转换
- isNaN ()
- 自增/自减运算符:
++、—- - 正号/负号:
+a、-a - 加号:
+ - 运算符:
-、*、/
同步、异步 Event Loop事件循环
Event Loop 即事件循环,是指浏览器或 Node 的一种解决 JavaScript 单线程运行时不会阻塞的机制。也就是我们经常使用的 异步 的原理
JavaScript 是一门单线程语言 Event Loop 是JavaScript 的执行机制。 事件循环是 JS 实现异步的一种方法,也是 JS 的执行机制
JavaScript 中:任务分为:宏任务(MacroTask 也叫 Task)、微任务(MicroTask)
宏任务:script 全部代码、setTimeout、setInterval、I/O、setImmediate(仅IE10 支持)
微任务:Promise、mutationObserver、Process.nextTick(Node 独有)
宏任务 是参与了事件循环的异步任务。 微任务 是没有参与事件循环的 ”异步“任务。
微观任务 是在当前 JS 调用执行完了之后立刻执行的,是同步的。在同一个调用栈里,没有多线程异步。微观任务是不属于事件循环的。
浏览器中的 Event Loop
Javascript 有一个 main thread 主线程和 call-stack 调用栈(执行栈),所有的任务都会被放到调用栈等待主线程执行。
promise 是在当前脚本代码执行完后,立刻执行的,它并没有参与事件循环,所以它的优先级是高于 setTimeout。
JS调用栈
JS调用栈采用的是后进先出的规则,当函数执行的时候,会被添加到栈的顶部,当执行栈执行完成后,就会从栈顶移出,直到栈内被清空。
JavaScript 单线程任务被分为 同步任务 和 异步任务 ,同步任务会在调用栈中按照顺序等待主线程依次执行,异步任务会在异步任务有了结果后,将注册的回调函数放入任务队列中等待主线程空闲的时候(调用栈被清空),被读取到栈内等待主线程执行。
执行栈在执行完同步任务后,查看执行栈是否为空,如果执行栈为空,就会去检查微任务(microTask)队列是否为空,如果为空的话,就执行Task(宏任务),否则就一次性执行完所有微任务。
每次单个宏任务执行完毕后,检查微任务(microTask)队列是否为空,如果不为空的话,会按照先入先出的规则全部执行完微任务(microTask)后,设置微任务(microTask)队列为null,然后再执行宏任务,如此循环。
setTimeout(function () {
console.log('定时器开始啦')
});
new Promise(function (resolve) {
console.log('马上执行for循环啦');
for (var i = 0; i < 10000; i++) {
i == 99 && resolve();
}
}).then(function () {
console.log('执行then函数啦')
});
console.log('代码执行结束');
// 执行如下:
马上执行for循环啦
代码执行结束
执行then函数啦
定时器开始啦