【面试】快手用户增长前端开发暑期实习面试

518 阅读2分钟

一面(牛客网视频面试)

  1. 自我介绍
  2. 问了两个项目相关的具体实现,有提到有没有了解过最新的Vue3的一些知识
  3. 项目中用到的Better-scroll包主要用来做什么(实现拖动到底/顶时的一个弹簧效果),该效果的实现原理?
  4. 问两个log的输出:
var name = 'x'
var people = {
  name: 'y',
  setName: (name) => {
    this.name = name
    return () => {
      return this.name
    }
  }
}

var getName = people.setName(name)
console.log(people.name) // y
console.log(getName()) // x
  1. log的输出顺序(Event Loop):
console.log('start')
setTimeout(() => {
  console.log('timer1')
  Promise.resolve().then(function () {
    console.log('promise1')
  })
}, 0)
setTimeout(() => {
  console.log('timer2')
  Promise.resolve().then(function () {
    console.log('promise2')
  })
}, 0)
Promise.resolve().then(function () {
  console.log('promise3')
})
console.log('end')
// start - end - promise3 - timer1 - promise1 - timer2 - promise2
  1. ES6常用语法: let/const、...、()=>{}、Promise、async/await (Promise、async/await的区别)
  2. css选择器权重优先级了解么?important>style>id>class>tag>wildcard
  3. 简述一下css盒模型。content/padding/border/margin
  4. 怎样设置两种盒模型,哪种盒模型更常用?box-sizing: border-box/content-box;
  5. 用flex实现一个css双列布局,左侧定宽200px,右侧自适应;flex是哪三个属性的缩写,flex-grow flex-shrink flex-basis;flex-basis与width有什么区别?
  6. 常用git命令了解哪些?add/commit/push/clone/merge/reset
  7. HTTPS是对称加密还是非对称加密?
  8. 前端跨域方式。proxy、JSONP、CORS、websocket
  9. 为什么有跨域限制?CORS怎么怎么保证安全性?CORS会默认携带cookie吗?
  10. 前端静态资源的协商缓存、强缓存了解么?
  11. 算法题:数字格式化为千分位
// 实现千分位
// 1234567 => 1,234,567
function format (num) {
    const list = (num + '').split('');
    let count = 0;
    for(let i = list.length - 1; i >= 0; i--) {
        count++;
        if (count === 3) {
            list.splice(i, 0, ',');
            count = 0;
        }
    }
    return list.join('');
}
console.log(format(1234567));
  1. 算法题:有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
// ()[] true
// ({}) true
// ({)} false
/**
* @param {String} str
* @returns {Boolean}
*/
function isValid(str) {
    if(!str.length || str.length % 2 !== 0) return false;
    const stack = [];
    const map = {
        ')': '(',
        '}': '{',
        ']': '[',
    };
    for(let i = 0; i < str.length; i++) {
        if(!map[str[i]]) {
            stack.push(str[i]);
        } else if(map[str[i]] === stack[stack.length - 1]) {
            stack.pop();
        }
    }
    return !stack.length;
}
console.log(isValid('({})'))