一、ES6 module:
1. 它是输出成一个对象的引用,而不是值的复制;
2. import是异步加载;
3. 模块是在静态代码编译的阶段,就编译成了一种输出的接口。而ES5的commonJS是在运行时加载执行的
ES6 module的引入:
如果是<script>标签形式引入,需要加type="model",标签内可以添加defer或async,两个的区别是:
defer:js模块下载完成后,会等到DOM渲染完成才去执行;
async:js模块下载完成后会立马执行,如果此时有DOM在渲染,那么DOM的渲染会暂时中止,等到JS执行完成后,再继续接着执行刚刚被中止的DOM渲染进程。
二、任意两个整数相加:
function solve( s , t ) { // write code here let tenthNum = 0 let lengthDiff = t.length > s.length ? t.length - s.length : s.length - t.length let strFill0 = new Array(lengthDiff).fill('0').join('') let arr1 = lengthDiff >= 0 ? t : s let arr2 = lengthDiff >= 0 ? strFill0 + s : strFill0 + t let result = '' for (let i = arr1.length - 1; i >= 0; i--) { let sum = parseInt(arr1[i]) + parseInt(arr2[i]) + tenthNum if (i === 0) { result = sum + result } else { let unitNum = sum >= 10 ? sum % 10 : sum result = unitNum + result tenthNum = Math.floor(sum / 10) } } return result }
三、async/await、promise和setTimeout写出以下代码的打印顺序:
async function async1() { console.log('async1 start'); await async2(); console.log('asnyc1 end'); } async function async2() { console.log('async2'); } console.log('script start'); setTimeout(() => { console.log('setTimeOut'); }, 0); async1(); new Promise(function (reslove) { console.log('promise1'); reslove(); }).then(function () { console.log('promise2'); }) console.log('script end');
结果:
- script start
-
async1 start
-
async2
-
promise1
-
script end
-
asnyc1 end
-
promise2
-
setTimeOut
分析:
1、执行console.log('script start')
,输出script start
;
2、执行setTimeout,是一个异步动作,放入宏任务异步队列中;
3、执行async1()
,输出async1 start
,继续向下执行;
4、执行async2()
,输出async2
,并返回了一个promise对象,await让出了线程,把返回的promise加入了微任务异步队列,所以async1()
下面的代码也要等待上面完成后继续执行;
5、执行 new Promise
,输出promise1
,然后将resolve
放入微任务异步队列;
6、执行console.log('script end')
,输出script end
;
7、到此同步的代码就都执行完成了,然后去微任务异步队列里去获取任务
8、接下来执行resolve(async2返回的promise返回的)
,输出了async1 end
。
9、然后执行resolve(new Promise的)
,输出了promise2
。
10、最后执行setTimeout
,输出了settimeout