前端面试题
题目介绍
- 如下为一段代码,请完善sum函数,使得 sum(1,2,3,4,5,6) 函数返回值为 21 ,需要在 sum 函数中调用 asyncAdd 函数,且不能修改asyncAdd函数
/**
* 请在 sum函数中调用此函数,完成数值计算
* @param {*} a 要相加的第一个值
* @param {*} b 要相加的第二个值
* @param {*} callback 相加之后的回调函数
*/
function asyncAdd(a,b,callback) {
setTimeout(function(){
callback(null, a+b)
},1000)
}
/**
* 请在此方法中调用asyncAdd方法,完成数值计算
* @param {...any} rest 传入的参数
*/
async function sum(...rest) {
// 请在此处完善代码
}
let start = window.performance.now()
sum(1, 2, 3, 4, 5, 6).then(res => {
// 请保证在调用sum方法之后,返回结果21
console.log(res)
console.log(`程序执行共耗时: ${window.performance.now() - start}`)
})
async function sum(...rest) {
let result = 0
// 隐氏类型转换, 对象 + 数字,会先调用对象的toString 方法
const obj = {}
obj.toString = function() {
return result
}
const promises = []
for(let num of rest) {
promises.push(new Promise((resolve) => {
asyncAdd(obj, num, (_, res) => {
resolve(res)
})
}).then(res => {
// 在这里将 result的值改变之后,obj.toString 的返回值就变了,这时候下一个setTimeout调用时就使用了新值
result = res
}))
}
await Promise.all(promises)
return result
}
// 执行成功,执行时长大于1秒小于2秒
sum1(1, 2, 3, 4, 5,6).then(res => {
console.log(`计算结果为:${res}`)
})
作者:前端进击者
链接:https://juejin.im/post/6859121743869509646
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。