2020年前端面试集锦(DOM HTTP 框架(Vue))

2019-12-22  本文已影响0人  缺月楼

DOM

  ul.addEventListener('click',function(e){
  if(e.target.tagName.toLowerCase() === 'li'){
    fn() // 执行某个函数 
    //console.log('您点击了li')
  }
})
。

高级版 :思路是点击 span 后,递归遍历 span 的祖先元素看其中有没有 ul 里面的 li。

function delegate(element, eventType, selector, fn) {
     element.addEventListener(eventType, e => {
       let el = e.target
       while (!el.matches(selector)) {
         if (element === el) {
           el = null
           break
         }
         el = el.parentNode
       }
       el && fn.call(el, e, el)
     })
     return element
   }
//HTML 部分 
<div id="xxx"></div>
// CSS部分 
div{
  border: 1px solid red;
  position: absolute;
  top: 0;
  left: 0;
  width: 100px;
  height: 100px;
}
*{margin:0; padding: 0;}
//JS部分 
//用户按下鼠标标记 判断是否在拖拽 默认没有 
var dragging = false
//上一次的坐标 默认为空 
var position = null

xxx.addEventListener('mousedown',function(e){
//   用户按下鼠标 开始拖拽  
  dragging = true
//   用户按下鼠标的时候 获取xy 
  position = [e.clientX, e.clientY]
})

// 监听鼠标的移动  mousemove 只能监听在document上面
document.addEventListener('mousemove', function(e){
  if(dragging === false){return}
  console.log('hi')
//  获取鼠标坐标 
  const x = e.clientX
  const y = e.clientY
  console.log(x,y)
//   位移 距离 用户鼠标移动的 距离 这一次 减去上一次的 
  const deltaX = x - position[0]
  const deltaY = y - position[1]
//   先换算单位 
  const left = parseInt(xxx.style.left || 0)
  const top = parseInt(xxx.style.top || 0)
//   位移写到div上面
  xxx.style.left = left + deltaX + 'px'
  xxx.style.top = top + deltaY + 'px'
//   这一次的坐标 继承 下一次的开始 
  position = [x, y]
})
document.addEventListener('mouseup', function(e){
  dragging = false
})

HTTP

正解:就一个区别:语义——GET 用于获取资源,POST 用于提交资源
详细请参考 : https://zhuanlan.zhihu.com/p/22536382

框架Vue

  1. 钩子在文档全都有,看红色的字。
  2. 把名字翻译一遍就是满分
  3. 要特别说明哪个钩子里请求数据,答案是 mounted
  1. 答案在文档《深入响应式原理
  2. 要点
    1. 使用 Object.defineProperty 把这些属性全部转为 getter/setter
    2. Vue 不能检测到对象属性的添加或删除,解决方法是手动调用 Vue.set 或者 this.$set

TypeScript

Webpack

  1. 必考:有哪些常见 loader 和 plugin,你用过哪些?
  2. 英语题:loader 和 plugin 的区别是什么?
  3. 必考:如何按需加载代码?
  4. 必考:如何提高构建速度?
  5. 转义出的文件过大怎么办?

上面五题请看这个不错的参考:https://zhuanlan.zhihu.com/p/44438844

安全

  1. 必考:什么是 XSS?如何预防?
    比较复杂,看方方的文章 https://zhuanlan.zhihu.com/p/22500730
  2. 必考:什么是 CSRF?如何预防?
    比较复杂,看若愚的文章 https://zhuanlan.zhihu.com/p/22521378

开放题目

  1. 必考:你遇到最难的问题是怎样的?
    要点:一波三折。参考 https://www.zhihu.com/question/35323603
  2. 你在团队的突出贡献是什么?
    把小事说大。
  3. 最近在关注什么新技术
    书、博客、推特、知乎,不要说 CSDN、百度。
  4. 有没有看什么源码,看了后有什么记忆深刻的地方,有什么收获
    看过源码说源码,推荐看 underscore.js 的源码
    没看过源码就说同事的代码,代码烂就说哪里烂,代码好就说哪里好
    收获:命名规范、设计模式
    刁钻题目
    代码
1、 [1,2,3].map(parseInt)
答案
 1
 NaN
 NaN
代码
2、 var a = {name: 'a'}
 a.x = a = {}
 问 a.x 是多少?
答案
 undefined
3、(a ==1 && a== 2 && a==3) 可能为 true 吗?
利用 == 会调用 valueOf() 的特性
 var a = {
  value: 1,
  valueOf(){
   return this.value++
  }
 }
 a ==1 && a== 2 && a==3 // true
利用 a 会读取 window.a 的特性
 var value = 1; 
 Object.defineProperty(window, 'a', {
     get(){
         return value++;
     }
 })
 a ==1 && a== 2 && a==3 // true
 // 或者 
 a ===1 && a=== 2 && a===3 // true
上一篇 下一篇

猜你喜欢

热点阅读