面试记录3

622 阅读2分钟

2020.06.09 genshuixue

ES6、7、8、9、10 你所知道的方法有哪些?

promise和async await与什么区别?async await的优势?

const p = new Promise(...)
p.then(funcA)
p.then(funcB)
setTimeout(() => {
  p.then(funcC)
}, 100)
ABC都会执行吗?

const p1 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('p1')
      resolve()
    }, 2000)
  })
}
const p2 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('p2')
      resolve()
    }, 2000)
  })
}
const p3 = () => {
  return new Promise((resolve) => {
    setTimeout(() => {
      console.log('p3')
      resolve()
    }, 2000)
  })
}
//期待每隔两秒输出p1、p2、p3,最后输出'done'
createQueue([p1, p2, p3]).then((msg) => {
  console.log(msg) // 'done'
})
function createQueue(tasks) {
    //code 
}

codepen.io/alianzhang/…

for...in和for...of区别

for...in循环出的是key,  for...of循环出的是value

for...in语句遍历一个对象的可枚举属性

它遍历的实际上是对象的属性名称,一个Array数组实际上也是一个对象,它的每个元素的索引被视为一个属性

for...of语句遍历可迭代对象定义的要迭代的数据

可迭代对象(包括 ArrayMapSetStringTypedArray,arguments 对象等等)

js事件循环机制

www.cnblogs.com/itgezhu/p/1…  一篇搞定(Js异步、事件循环与消息队列、微任务与宏任务)

同步代码执行完成后现在异步队列如下:
微任务:EFG (E里面产生一个微任务H)宏任务:ABC (B里面产生一个微任务I)执行顺序?EFGH ABIC

console.log('script start')

setTimeout(function() {
    console.log('setTimeout1')
    Promise.resolve().then(() => {
        console.log('promise1')
    })
},0)

setTimeout(function() {
    console.log('setTimeout2')
},0)

let promise2 = new Promise((resolve) => {
    resolve('promise2.then')
    console.log('promise2')
})

promise2.then((res) => {
    console.log(res)
    Promise.resolve().then(() => {
        console.log('promise3')
    })
})

闭包知道吗?

拓展-》平时工作中哪些地方用到了闭包?

做题:

add(1)() => 1
add(1)(2)(3)(4)() => 10
// 输入一定是一个非0整数 或者不带任何参数,所以不用严格考虑参数检查


add(1)
add(2)
add(3)
add() // 6

const fun = () => {
  let sum = 0
  return num => {
    if(num) {
      sum += num
    } else {
      console.log(sum)
      return sum
    }
  }
}
const add = fun()

或者:




// add(1)(2)(3)
const add = x => {
  return y => {
    return z => {
      return x + y + z
    }
  }
}
console.log(add(1)(2)(3))


const add = num => {
  let sum = num
  const fun = x => {
    if(x) {
      sum += x
      return fun
    } else {
      return sum
    }
  }
  return fun
}
console.log(add(1)(2)(3)(4)()) 

函数柯里化(curry)

每次调用函数时,它只接受一部分参数,并返回一个函数,直到传递所有参数为止。

函数柯里化主要有3个作用: 

参数复用:同一个参数的这部分逻辑可以共用提前返回: 它只接受一部分参数,并返回一个函数延迟执行: 直到传递所有参数为止

实现一个把普通函数柯里化的方法:

// 我们写一个通用的柯里化函数的方式,经过这个函数的转换,我们可以将调用方式简化
function curry = (fn,...args){
	
  }
}