【手写】一些情景题 记录

1. 实现每隔一秒打印1234

可以使用es6的let 也可以使用var+立即执行函数

function print() {
    for (let i = 0; i < 5; i++) {
        setTimeout(() => {
            console.log(i)
        },1000 * i)
    }
}
print()

// 或者是下面这样
function print() {
    for (var i = 0; i < 5; i++) {
        (function (i) {
            setTimeout(() => {
                console.log(i)
            }, 1000 * i)
        })(i)
    }
}

print()

2. 循环打印红黄绿

下面来看一道比较典型的问题,通过这个问题来对比几种异步编程方法:红灯 3s 亮一次,绿灯 1s 亮一次,黄灯 2s 亮一次;如何让三个灯不断交替重复亮灯?

方法一 使用 callback

const task = (timer, light, callback) => {
    setTimeout(() => {
        if (light === 'red') {
            console.log('red');
        } else if (light === 'green') {
            console.log('green');
        } else if (light === 'yellow') {
            console.log('yellow');
        }
        callback()
    },timer)
}

// task(3000, 'red', () => {
//     task(2000, 'green', () => {
//         task(1000,'yellow', Function.prototype)
//     })
// })


const step = () => {
    task(3000, 'red', () => {
        task(2000, 'green', () => {
            task(1000,'yellow', step)
        })
    })
}

step()

方法二 使用 promise

function task(timer,light) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (light === 'red') {
                console.log('red');
            } else if (light === 'green') {
                console.log('green');
            } else if (light === 'yellow') {
                console.log('yellow');
            }
            resolve()
        },timer)
    })
}


这个是使用promise
const step = () => {
    task(3000, 'red')
        .then(() => task(2000, 'green'))
        .then(() => task(1000, 'yellow'))
        .then(step)
}

step()

方法三 async await

function task(timer,light) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (light === 'red') {
                console.log('red');
            } else if (light === 'green') {
                console.log('green');
            } else if (light === 'yellow') {
                console.log('yellow');
            }
            resolve()
        },timer)
    })
}

const taskRunner = async () => {
    await task(3000, 'red')
    await task(2000, 'green')
    await task(2100, 'yellow')
    taskRunner()
}
taskRunner()

3. 实现jsonp

jsonp是利用js中对script标签里面的url可以进行跨域访问的操作

// 动态加载js文件
function addScript(src) {
    const script = document.createElement('script');
    script.src = src;
    script.type = "text/javascript";
    document.body.appendChild(script);
}

addScript("http://xxx.xxx.com/xxx.js?callback=handleRes")

function handleRes(res) {
    console.log(res);
}
handleRes({a:1,b:2})

4. js对象转换成树

// 转换前:
data = [
    { id: 1, pid: 0, name: 'body' },
    { id: 2, pid: 1, name: 'title' },
    { id: 3, pid: 2, name: 'div' }
]
// 转换为: 
tree = [{a
  id: 1,
  pid: 0,
  name: 'body',
  children: [{
    id: 2,
    pid: 1,
    name: 'title',
    children: [{
      id: 3,
      pid: 2,
      name: 'div'
    }]
  }
}]

function jsonToTree(data) {
    let result = []
    if (!Array.isArray(data)) {
        return result;
    }

    let map = {}
    data.forEach(item => {
        map[item.id] = item
    })
    // console.log(map)
    // {
    //     '1': { id: 1, pid: 0, name: 'body' },
    //     '2': { id: 2, pid: 1, name: 'title' },
    //     '3': { id: 3, pid: 2, name: 'div' }
    // }

    data.forEach(item => {
        let parent = map[item.pid]
        if (parent) {
            (parent.children || (parent.children = [])).push(item)
        } else {
            result.push(item);
        }
    })
    return result
}

jsonToTree(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值