,即主线程为空时,会检查微任务队列,如果有任务,就全部执行,如果没有就执行下一个宏任务(事件触发线程管理的 任务队列 中); 上述过程会不断重复,这就是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
基本数据类型 字符串(string)、数字(number)、布尔(boolean)、未定义的(undefined), 引用数据类型 数组(array)、对象(object)、函数(function...null)、集合(set)、键值对(map) 转换 转字符串 tostring()方法 转数字 Number()方法 若字符串中包含任意一个非有效数字字符,结果都是NAN,空的字符串会变为...对于字符串来说,他是从左到右依次查找有效数字,直到遇到非有效数字字符字符才停止查找,把找到的数字返回。...当进行比较运算的时候,会自动把比较的对象转成数字进行比较 转布尔 Boolean([val])方法 !!...只要“&&”前面是false,无论“&&”后面是true还是false,结果都将返“&&”前面的值;只要“&&”前面是true,无论“&&”后面是true还是false,结果都将返“&&”后面的值。
立即解决的承诺比立即超时处理得更快。 是因为 Promise.resolve(true).then(...)...实验表明,立即解决的 promise 在立即超时之前已得到处理。所以。。。这是为什么? 事件循环 与异步 JavaScript 有关的问题可以通过探索事件循环解答答。...最后,事件循环(event loop) 会一直监视调用栈是否为空。如果调用栈为空,则事件循环会查找工作队列或任务队列,并使准备好执行的回调出队到调用栈中。...事件循环 调用栈执行 Promise.resolve(true).then(resolve) 并“安排”一个 promise 解析。...是由于事件循环的“优先级”使任务队列(存储已实现的 promise 的回调)中的任务从任务队列(存储超时的setTimeout() 回调)中的任务中出队。
前言 之前我们学习了快速排序算法及其实现: 【排序算法】八大排序(下)(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
这里顺便说下 for 循环的处理过程:在 Python 中我们经常使用 for 循环来对某个对象进行遍历,此时被遍历的这个对象就是可迭代对象,常见的有列表,元组,字典。...for 循环开始时自动调用可迭代对象的 __iter__ 方法获取一个迭代器,for 循环时自动调用迭代器的 next 方法获取下一个元素,当调用可迭代器对象的 next 方法引发 StopIteration...StopIteration # 超出上边界,抛出异常 类 MyListIterator 实现了 __iter__ 方法和 __next__ 方法,因此它是一个迭代器对象,由于 __iter__ 方法本返的是迭代器...遍历操作可使用 for 循环,无法使用 next()。for 循环实质上还是调用 MyListIterator 的 __next__ 方法。...创建一个生成器 像定义一般函数一样,只不过使用 yield 返回中间结果。
promise本身,否则将导致无限循环。...片段 8: Promise.resolve(1) .then(2) .then(Promise.resolve(3)) .then(console.log) // 1 .then或.catch...的参数应为函数,而传递非函数将导致值的结果被忽略,例如.then(2)或.then(Promise.resolve(3)。...Print 4 // Print 1 // Print 2 // Print 3 process.nextTick和promise.then都属于微任务,而setImmediate属于宏任务,它在事件循环的检查阶段执行...在事件循环的每个阶段(宏任务)之间执行微任务,并且事件循环的开始执行一次。
等价于 return Promise.resolve(new Error('error!!!'))。...promise 本身,否则会造成死循环。...(1) .then(2) .then(Promise.resolve(3)) .then(console.log) 运行结果: 1 解释:.then 或者 .catch 的参数期望是函数,...nextTick then setImmediate 解释:process.nextTick 和 promise.then 都属于 microtask,而 setImmediate 属于 macrotask,在事件循环的...事件循环的每个阶段(macrotask)之间都会执行 microtask,事件循环的开始会先执行一次 microtask。
等价于 return Promise.resolve(new Error('error!!!'))。...promise 本身,否则会造成死循环。...(1) .then(2) .then(Promise.resolve(3)) .then(console.log) 运行结果: 1 解释:.then 或者 .catch 的参数期望是函数...then setImmediate 解释:process.nextTick 和 promise.then 都属于 microtask,而 setImmediate 属于 macrotask,在事件循环的...事件循环的每个阶段(macrotask)之间都会执行 microtask,事件循环的开始会先执行一次 microtask。 ---- 》声明:文章著作权归作者所有,如有侵权,请联系小编删除。
事件循环 Event loop 很难想象有哪个JavaScript面试不会提到事件循环这个主题。...要轻松记住一种编程语言是如何工作的,了解为什么它是这样工作的会很有帮助(简单吧!)。 这种行为是因为 const 变量而被选中的。访问未定义的 var 变量时,我们得到的是undefined。...解释: 在命名函数表达式中,名称只在函数体内部是局部的,外部无法访问。因此,全局作用域中不存在foo。 typeof运算符对未定义的变量返回undefined。...Promise.resolve(1) .then(x => { throw x }) .then(x => console.log(`then ${x}`)) .catch(err => console.log...(`error ${err}`)) .then(() => Promise.resolve(2)) .catch(err => console.log(`error ${err}`)) .then
一个事件循环(eventLoop)的执行顺序(非常重要): ① 开始执行脚本。...事件循环的顺序,决定了 JavaScript 代码的执行顺序。它从 script (整体代码) 开始第一次循环。之后全局上下文进入函数调用栈。...0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在下一次的事件循环中执行)。...接着遇到setTimeout 0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在再下一次的事件循环中执行)。...最后的最后,记住,JavaScript 是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。
事件循环的顺序,决定了 JavaScript 代码的执行顺序。它从 script (整体代码) 开始第一次循环。之后全局上下文进入函数调用栈。...当所有可执行的microtasks 执行完毕之后。循环再次从 macrotasks 开始,找到其中一个任务队列执行完毕,然后再执行所有的 microtasks,这样一直循环下去。...0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在下一次的事件循环中执行)。...接着遇到setTimeout 0,它的作用是在 0ms 后将回调函数放到宏任务队列中(这个任务在再下一次的事件循环中执行)。...最后的最后,记住,JavaScript是一门单线程语言,异步操作都是放到事件循环队列里面,等待主执行栈来执行的,并没有专门的异步执行线程。
Promise.resolve() 有时需要将现有对象转为 Promise 对象,以便于链式的使用then方法,Promise.resolve方法就起到这个作用。...Promise.resolve('foo') // 等价于 new Promise(resolve => resolve('foo')) Promise.resolve方法的参数分成四种情况。...Promise.resolve方法的参数,会同时传给回调函数。 4)不带有任何参数 Promise.resolve方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。...需要注意的是,立即resolve的 Promise 对象,是在本轮“事件循环”(event loop)的结束时,而不是在下一轮“事件循环”的开始时。.... resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。
=> { console.log("then3:", data); }).catch(err => { console.log("err:", err); }) 复制代码 这样可以一直返...方法都返回的时候,或者所有输入的 Promise 对象中有一个 reject 的时候,这个 all 就会执行结束,来看如下一个案例: const promise1 = Promise.resolve(...和 all 方法的区别在于,race 方法是谁执行的快,就用谁的结果。...6.4 Promise.resolve() Promise.resolve(value) 方法返回一个以给定值解析后的 Promise 对象。...const promise1 = Promise.resolve(3); promise1.then(data=>{ console.log("data", data); },err=>{
等价于 return Promise.resolve(new Error('error!!!'))。...promise 本身,否则会造成死循环。...catch 是 .then 第二个参数的简便写法,但是它们用法上有一点需要注意:.then 的第二个处理错误的函数捕获不了第一个处理成功的函数抛出的错误,而后续的 .catch 可以捕获之前的错误。...thensetImmediate 解释:process.nextTick 和 promise.then 都属于 microtask,而 setImmediate 属于 macrotask,在事件循环的...事件循环的每个阶段(macrotask)之间都会执行 microtask,事件循环的开始会先执行一次 microtask。 ---- 本文作者为石墨文档的 nswbmw 同学。 完
其一 群里看到的一道事件循环的题: 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 方法的时候,会把回调分发到微任务队列。
等价于 return Promise.resolve(new Error('error!!!'))。...promise 本身,否则会造成死循环。...(1) .then(2) .then(Promise.resolve(3)) .then(console.log) 运行结果: 1 解释:.then 或者 .catch 的参数期望是函数,传入非函数则会发生值穿透...nextTick then setImmediate 解释:process.nextTick 和 promise.then 都属于 microtask,而 setImmediate 属于 macrotask,在事件循环的...事件循环的每个阶段(macrotask)之间都会执行 microtask,事件循环的开始会先执行一次 microtask。 声明 | 文章著作权归作者所有,如有侵权,请联系小编删除。
; Promise 的状态一旦转化,将不能被更改; repromise api 食用手册 Promise.resolve() Promise.resolve() 括号内有 4 种情况 /* 跟 Promise...对象 */ Promise.resolve(Promise.resolve(1)) // Promise {state: "resolved", data: 1, callbackQueue: Array...(1) // Promise {state: "resolved", data: 1, callbackQueue: Array(0)} /* 不跟参数 */ Promise.resolve() //...1:事件循环 事件循环:同步队列执行完后,在指定时间后再执行异步队列的内容。...之所以要单列事件循环,因为代码的执行顺序与其息息相关,此处用 setTimeout 来模拟事件循环; 下面代码片段中,① 处执行完并不会马上执行 setTimeout() 中的代码(③),而是此时有多少次
领取专属 10元无门槛券
手把手带您无忧上云