JavaScript学习笔记(贰)

69 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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函数啦
  定时器开始啦