首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

「硬核JS」图解Promise迷惑行为|运行机制补充

,即主线程为空时,会检查微任务队列,如果有任务,就全部执行,如果没有就执行下一个宏任务(事件触发线程管理的 任务队列 中); 上述过程会不断重复,这就是Event Loop,事件循环。...浏览器中加上渲染的话就是先执行一个宏任务,再执行当前所有的微任务,接着开始执行渲染,然后再执行下一个宏任务,如此循环。...「避免循环引用,当 then 的返回值与新生成的 Promise 对象为同一个(引用地址相同),则抛出 TypeError 错误:」 例: let promise2 = p.then((data) =>...方法执行后,其回调也会入队等待,我们记作 P1-t1返 回调,其实 P1-t1返 这个 Promise 实例就是 Promise.resolve(2).then((res)=>{...}) 。...-t1返 这个回调是之前 P1-t1 中的 Promise.resolve(2) 的 then 方法回调,它是在内部调用的,其实什么都没做,只是通过 then 取到成功态然后再将 2 这个值传 resolve

2.2K30

js数据类型的介绍与转换

基本数据类型 字符串(string)、数字(number)、布尔(boolean)、未定义的(undefined), 引用数据类型 数组(array)、对象(object)、函数(function...null)、集合(set)、键值对(map) 转换 转字符串   tostring()方法 转数字     Number()方法 若字符串中包含任意一个非有效数字字符,结果都是NAN,空的字符串会变为...对于字符串来说,他是从左到右依次查找有效数字,直到遇到非有效数字字符字符才停止查找,把找到的数字返回。...当进行比较运算的时候,会自动把比较的对象转成数字进行比较 转布尔 Boolean([val])方法 !!...只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值。

1.1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么 Promis 比setTimeout()更快?

    立即解决的承诺比立即超时处理得更快。 是因为 Promise.resolve(true).then(...)...实验表明,立即解决的 promise 在立即超时之前已得到处理。所以。。。这是为什么? 事件循环 与异步 JavaScript 有关的问题可以通过探索事件循环解答答。...最后,事件循环(event loop) 会一直监视调用栈是否为空。如果调用栈为空,则事件循环会查找工作队列或任务队列,并使准备好执行的回调出队到调用栈中。...事件循环 调用栈执行 Promise.resolve(true).then(resolve) 并“安排”一个 promise 解析。...是由于事件循环的“优先级”使任务队列(存储已实现的 promise 的回调)中的任务从任务队列(存储超时的setTimeout() 回调)中的任务中出队。

    74320

    【排序算法】快速排序升级版--三路快排详解 + 实现(c语言)

    前言 之前我们学习了快速排序算法及其实现: 【排序算法】八大排序(下)(c语言实现)(附源码)-CSDN博客 不过它的缺陷也很明显:当数组中存在大量相同元素时,那些与基准值相同的元素的划分方法是未定义的...一、三路快排的整体思路 所谓三路快排,就是从快速排序的划分上,由原来的两部分变为三部分:左边是比基准值小的数据;中间是与基准值相同的数据;右边是比基准值大的数据。...当cur超过right位置时,划分结束,退出循环。 我们画图模拟一下它的划分过程: 注意划分完成后left和right所处的位置,便于确定下次递归的区间。...} return 0; } //交换两元素 void Swap(int* x, int* y) { int tmp = *x; *x = *y; *y = tmp; } //三数取中法,返回中间值的下标...= *y; *y = tmp; } //三数取中法,返回中间值的下标 int MidOfThree(int* arr, int a, int b, int c) { if (arr[a] > arr

    21410

    python 基础系列--可迭代对象、迭代器与生成器

    这里顺便说下 for 循环的处理过程:在 Python 中我们经常使用 for 循环来对某个对象进行遍历,此时被遍历的这个对象就是可迭代对象,常见的有列表,元组,字典。...for 循环开始时自动调用可迭代对象的 __iter__ 方法获取一个迭代器,for 循环时自动调用迭代器的 next 方法获取下一个元素,当调用可迭代器对象的 next 方法引发 StopIteration...StopIteration # 超出上边界,抛出异常 类 MyListIterator 实现了 __iter__ 方法和 __next__ 方法,因此它是一个迭代器对象,由于 __iter__ 方法本返的是迭代器...遍历操作可使用 for 循环,无法使用 next()。for 循环实质上还是调用 MyListIterator 的 __next__ 方法。...创建一个生成器 像定义一般函数一样,只不过使用 yield 返回中间结果。

    63530

    22道js输出顺序问题,你能做出几道5

    事件循环的顺序,决定了 JavaScript 代码的执行顺序。它从 script (整体代码) 开始第一次循环。之后全局上下文进入函数调用栈。...当所有可执行的microtasks 执行完毕之后。循环再次从 macrotasks 开始,找到其中一个任务队列执行完毕,然后再执行所有的 microtasks,这样一直循环下去。...0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在下一次的事件循环中执行)。...接着遇到setTimeout 0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在再下一次的事件循环中执行)。...最后的最后,记住,JavaScript是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

    65520

    22道js输出顺序问题,你能做出几道

    事件循环的顺序,决定了 JavaScript 代码的执行顺序。它从 script (整体代码) 开始第一次循环。之后全局上下文进入函数调用栈。...当所有可执行的microtasks 执行完毕之后。循环再次从 macrotasks 开始,找到其中一个任务队列执行完毕,然后再执行所有的 microtasks,这样一直循环下去。...0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在下一次的事件循环中执行)。...接着遇到setTimeout 0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在再下一次的事件循环中执行)。...最后的最后,记住,JavaScript是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

    2K30

    记两道关于事件循环的题

    其一 群里看到的一道事件循环的题: async function async1() { console.log("async1 start"); await async2(); console.log...之后,微任务队列中无任务,第二轮事件循环结束 第二轮事件循环: ① 宏任务:根据之前进队列的顺序,宏任务队列中依次有 timer2、timer3 和 timer1 这几个定时器的回调函数。...timer2 的回调函数进入主栈并执行,打印 timer2 ② 微任务:微任务队列中无任务,第二轮事件循环结束 第三轮事件循环: ① 宏任务:宏任务队列中依次有 timer3 和 timer1 这两个定时器的回调函数...timer3 的回调函数进入主栈并执行,打印 timer3 ② 微任务:微任务队列中无任务,第三轮事件循环结束 第四轮事件循环: ① 宏任务:宏任务队列中只有 timer1 这个定时器的回调函数。...接着遇到了 Promise.resolve(promises[0]),这里实际上也是一个处于 pending 状态的 Promise,调用它的 then 方法的时候,会把回调分发到微任务队列。

    39420

    22道js输出顺序问题,你能做出几道

    事件循环的顺序,决定了 JavaScript 代码的执行顺序。它从 script (整体代码) 开始第一次循环。之后全局上下文进入函数调用栈。...当所有可执行的microtasks 执行完毕之后。循环再次从 macrotasks 开始,找到其中一个任务队列执行完毕,然后再执行所有的 microtasks,这样一直循环下去。...0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在下一次的事件循环中执行)。...接着遇到setTimeout 0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在再下一次的事件循环中执行)。...最后的最后,记住,JavaScript是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。

    1.1K30
    领券