面经练习(二)
1.const要完全不能修改怎么做
利用 Object.defineProperty里面的writable属性
还可以利用Object.freeze()进行冻结
原理:
2. Object.defineProperty的用法
Object.defineProperty()函数是给对象设置属性的。
3.http请求头:
4.post请求的四种数据格式
1.application/json:这是最常见的 json 格式
2.application/x-www-form-urlencoded浏览器的原生 form 表单
3.multipart/form-data:这一种是表单格式的
4.text/xml
5.有关promise
有关promise
支持链式写法,then和catch返回的都是一个全新的Promise对象,在执行这两个方法后,不论返回的数据类型是什么,都会被包装成一个全新的Promise对象。返回的数据会传递到下一个链式方法里作为参数
Promise.resolve(value):
当一个实例如果不是promise对象,可以用Promise.resolve转换成promise对象
Promise.reject(error):
Promise.all(array):接收一个 promise对象的数组作为参数,当这个数组里的所有promise对象全部变为resolved的时候,它才会去调用 .then 方法
如果有一个变为rejected,会把第一个rejected的promise的返回值,传给下一个回调函数
Promise.race(array):接收一个 promise对象的数组作为参数,当这个数组里只要有一个promise对象发生状态改变(进入rejec或fulfilled状态)的时候,它才会去调用 .then 方法。
6.有关宏任务和微任务
有关宏任务和微任务
从event loop到async await来了解事件循环机制
event loop:
1.首先判断JS是同步还是异步,同步就进入主线程运行,异步就进入event table。
2.异步任务在event table中注册事件,当满足触发条件后(触发条件可能是延时也可能是ajax回调),被推入event queue,宏任务进入宏任务event queue,微任务进入微任务event queue
3.同步任务进入主线程后一直执行,直到主线程空闲时,才会去event queue中查看是否有可执行的异步任务,如果有就推入主线程中,先推入微任务event queue的任务,再推入宏任务event queue
异步任务分为宏任务和微任务
宏任务(macro-task):包括整体代码script,setTimeout,setInterval。
微任务(micro-task):Promise,process.nextTick。
在划分宏任务、微任务的时候并没有提到async/await因为async/await的本质就是Promise。
结果为 374125 注意6不会输出,因为里层的promise在输出1的时候,resolve状态已经实现了,不会改变。
注意一个promise中,.then是同步的,必须第一个then执行完毕(有结果,有进入队列的),下一个then才会进入微任务队列
输出结果:172384650
此题视频详解
7.async/await
从event loop到async await来了解事件循环机制
可以让异步的代码写的更加简洁
async function async1() {
console.log('2')
const data = await async2()
console.log(data)
console.log('8')
}
async function async2() {
return new Promise(function (resolve) {
console.log('3')
resolve('await的结果')
}).then(function (data) {
console.log('6')
return data
})
}
console.log('1')
setTimeout(function () {
console.log('9')
}, 0)
async1()
new Promise(function (resolve) {
console.log('4')
resolve()
}).then(function () {
console.log('7')
})
console.log('5')
setTimeout(function () {
console.log('8')
}, 0)
async function async1() {
console.log('1')
const data = await async2()
console.log('6')
return data
}
async function async2() {
return new Promise(resolve => {
console.log('2')
resolve('async2的结果')
}).then(data => {
console.log('4')
return data
})
}
async1().then(data => {
console.log('7')
console.log(data)
})
new Promise(function (resolve) {
console.log('3')
resolve()
}).then(function () {
console.log('5')
})