【面试总结】一个小时的淘天集团都问了些什么内容

303 阅读3分钟

八股文

  • 自我介绍
  • 对前端的理解
  • 项目里面遇到什么难题,如何解决
  • 加载图片如何优化
  • 懒加载是怎么实现的
  • 对Vue框架的理解
  • Vue双向数据绑定是怎么实现的
  • 能否直接给一个对象添加属性,该怎么添加
  • 对React框架的理解
  • visibility:hidden和display:none有什么区别,visibility:hidden可继承吗
    visibility具有继承性,给父元素设置visibility:hidden;子元素也会继承这个属性。但是如果重新给子元素设置visibility: visible,则子元素又会显示出来。这个和display: none有着质的区别
display: nonevisibility: hiddenopacity: 0
是否占有空间×
是否可以进行DOM事件监听××
是否可以点击××
是否可以被子元素继承×
子元素能否通过改变属性值来改变继承自父亲的隐藏状态××
  • 浏览器从输入url到页面展示内容发生了什么
  • 具体说一下页面解析的过程
  • css文件会阻塞js文件加载吗
  • 重绘和重排的区别,什么会导致重绘,什么会导致重排
  • 减少重排的办法

浅谈CSS重绘和回流(重排)—— 如何减少重绘和回流(重排)_css设置统一类名 避免回流-CSDN博客

  • 一个最上面的节点,用什么操作能够移动该节点同时不影响下面元素
  • diff算法

手撕题

3 + '5' + 3

结果为'353'

  • + 号两边只要有一个是字符串,都会把另外一个转成字符串
  • + 号只有一边时,会把该变量变为数字
  • 除了+以外的算术运算符 比如 - * / 等都会把数据转成数字类型

promise和setTimeout的输出顺序

实现react里面的count每一秒加1

这里考察的是setCount的异步更新以及参数可以传递函数

function App() {
  const [count, setCount] = useState(0)

  useEffect(()=>{
          setInterval(()=>{
                setCount((count) => count + 1); //这里是重点
            }, 1000)
      }
  )

  return (
    <div>
      count is: {count}
    </div>
  )
}

爬楼梯

动态规划

考虑优化

Promise手写题

实现 一个结构,register方法传入一个字符串进行注册,wait传入一个字符串数组,返回一个promise对象,只有当数组里面的所有字符串都被注册后才调用then方法

思路:wait方法返回一个promise对象,应该是promise.all方法返回的对象。等待所有字符串被注册,因此应该有一个挂起的状态,也就是把resolve方法保存起来。

难点:可能先调用wait方法,也可能先调用register方法,因此两个方法里都要有逻辑的判断。

let p1 = new myObject()
let obj = p1.wait(['A','B']).then(()=>{
    console.log('A','B','done')
})
p1.register('A')
P1.register('B')
class myObject {
    constructor(){
        this.map = new Map() //存储需要注册的key及其对应的resolve方法
        this.doneMap = new Map() // 存储已经注册了的key
        this.proArr = [] //存储需要注册的key的promise
    }
    
    wait(arr){
        for(let key of arr){
            let p = new Promise((resolve, reject)=>{
                if(this.doneMap.has(key)){
                    resolve()
                }else{
                    this.map.set(key, resolve)
                } 
            })
            this.proArr.push(p)
        }
        return Promise.all([...proArr])
    }
    
    register(key){
        let p = new Promise((resolve, reject)=>{
            if(this.map.has(key)){
                let resolve1 =  this.map.get(key)
                resolve1()
            }
            resolve()
            this.doneMap().set(key, resolve)
        })
    }
}