2024蓝桥考后即刻拷打

84 阅读2分钟

1.购物历史清单那题(这题是因为平时Date对象用得少,不了解相关api)

————把日期转YYYY-MM-DD格式

const date = new Date();

const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始
const day = String(date.getDate()).padStart(2, '0'); 

const formattedDate = `${year}-${month}-${day}`;

2.reduce一个函数数组(函数返回Promise对象或普通值)那题

————如何判断一个值是否为Promise实例(当时第一反应用这个来做个判断,但脑子短路忘记instanceof方法了。现在意识到无需做判断,只要统一转换成Promise即可)

myPromise instanceof Promise

————统一转换成Promise(后来看MDN才知道的一点:Promise.resolve()可以将嵌套的类Promise对象展平

const myPromise = Promise.resolve(myValue)
//Promise.resolve()传入的参数是一个Promise对象,则返回这个 Promise 对象本身,且不会改变其状态;
//如果传入的参数不是Promise对象,则返回一个新的以传入参数为值的Promise对象,并且这个 Promise对象会变为 resolved(fulfilled)状态

所以最后大概写法是:

function task1(data){
    return (data+'-->execute task1')
}

function task2(data){
    return new Promise(reslove => resolve(data+'-->execute task2'))
}

function sequenceTasks(tasks, initialValue){
    return tasks.reduce((total, curr_task) => total.then(res => Promise.resolve(curr_task(res))), Promise.resolve(initialValue))
}

sequenceTasks([task1, task2], 'task start')
    .then(res => console.log('Final Result:', res))
    .catch(err => console.error('Error:', err))

3.手写Promise.race那题

————判断是否为可迭代对象

function isIterable(obj) {
    // 使用 typeof 检查是否为对象 
    if (typeof obj !== 'object' || obj === null) { return false; } 
    // 使用 in 操作符检查是否有 Symbol.iterator 属性
     return Symbol.iterator in obj
}

————手写Promise.race

function myRace(tasks){
    if(!isIterable(tasks)) throw new Error('请传入可迭代对象')
    
    return new Promise((resolve, reject) => {
        //forEach不会等待异步操作完成,所以可以使用
        tasks.forEach((task) => {
            if(task instanceof Promise){
                task.then(res => return resolve(res), err => reject(res))
            } else {
                return resolve(task)
        })
    })
}

这次初赛就当作给接下来实习面试的警钟吧

脚踏实地,打牢基础,戒骄戒躁