打印顺序依次为:
script start
async2 end
Promise
script end
async1 end
promise1
promise2
setTimeout
JS 运行机制为从上而下,首先打印script start,async/await 是Promise包装执行会立即执行async2()打印async2 end,把setTimeout加入宏任务队列但是不会立马执行,往下走,Promise创建属于同步任务此时打印Promise,并放入宏任务队列中,再往下走直接打印script end,此时如果有微任务会优先执行微任务队列,微任务队列执行完毕再执行宏任务,async1 end 的打印是因为执行了Promise.then的方法,继续微任务输出promise1、promise2,当微任务队列为空,执行宏任务setTimeout,此时打印setTimeout。
说说事件循环(Event Loop)
一个 Event Loop 中,可以有一个或者多个任务队列(task queue),一个任务队列便是一系列有序任务(task)的集合;每个任务都有一个任务源(task source),源自同一个任务源的 task 必须放到同一个任务队列,从不同源来的则被添加到不同队列。setTimeout/Promise 等API便是任务源,而进入任务队列的是他们指定的具体执行任务。
在事件循环中,每进行一次循环操作称为 tick,每一次 tick 的任务处理模型是比较复杂的,
关键步骤如下:
在此次 tick 中选择最先进入队列的任务(oldest task),如果有则执行(一次)
检查是否存在 Microtasks,如果存在则不停地执行,直至清空 Microtasks Queue
更新 render
主线程重复执行上述步骤
在上诉tick的基础上需要了解几点:
1、JS分为同步任务和异步任务
2、同步任务都在主线程上执行,形成一个执行栈
3、主线程之外,事件触发线程管理着一个任务队列,只要异步任务有了运行结果,就在任务队列之中放置一个事件。
4、一旦执行栈中的所有同步任务执行完毕(此时JS引擎空闲),系统就会读取任务队列,将可运行的异步任务添加到可执行栈中,开始执行。
从给定的数据中,随机抽出一项,这项的左边放所有比它小的,右边放比它大的,然后再分别这两边执行上述操作,采用的是递归的思想,总结出来就是 实现一层,分别给两边递归,设置好出口
function fastSort(array,head,tail){//考虑到给每个分区操作的时候都是在原有的数组中进行操作的,所以这里head,tail来确定分片的位置
/*生成随机项*/
var randomnum = Math.floor(ranDom(head,tail))
var random = array[randomnum]
/*将小于random的项放置在其左边 策略就是通过一个临时的数组来储存分好区的结果,再到原数组中替换*/
var arrayTemp = []
var unshiftHead = 0
for(var i = headi <= taili++){
if(array[i]<random){
arrayTemp.unshift(array[i])
unshiftHead++
}else if(array[i]>random){
arrayTemp.push(array[i])
}
/*当它等于的时候放哪,这里我想选择放到队列的前面,也就是从unshift后的第一个位置放置*/
if(array[i]===random){
arrayTemp.splice(unshiftHead,0,array[i])
}
}
/*将对应项覆盖原来的记录*/
for(var j = head , u=0j <= tailj++,u++){
array.splice(j,1,arrayTemp[u])
}
/*寻找中间项所在的index*/
var nowIndex = array.indexOf(random)
/*设置出口,当要放进去的片段只有2项的时候就可以收工了*/
if(arrayTemp.length <= 2){
return
}
/*递归,同时应用其左右两个区域*/
fastSort(array,head,nowIndex)
fastSort(array,nowIndex+1,tail)
}
JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。
sort() 方法用于对数组的元素进行排序。语法如下:
arrayObject.sort(sortby)例如:
function NumAscSort(a,b)
{
return a - b
}
function NumDescSort(a,b)
{
return b - a
}
var arr = new Array( 3600, 5010, 10100, 801)
arr.sort(NumDescSort)
alert(arr)
arr.sort(NumAscSort)
alert(arr)