美文网首页
面试题汇总

面试题汇总

作者: 头大如牛 | 来源:发表于2019-05-09 23:52 被阅读0次

    HTML题目

    1. meta viewport是干什么的

    <meta name="viewport" content="width=device-width, initial-scale=1, maximun-scale=1">
    

    通过将初始缩放和最小缩放设置为0.86来限制一些智能手机的缩小操作。结果是水平滚动在任何方向都被抑制,用户可以根据需要放大。

    <meta name="viewport" content="width=device-width, initial-scale=0.86, maximun-scale=3.0, minimum-scale=0.86">
    

    2. 什么是函数式编程

    �抽象问题搜知乎,代码问题搜MDN stackoverflow或者博客

    3. 用过哪些html5标签

    header main footer article
    // 以下标签肯定会追问深入
    canvas video audio

    4. html5新特性

    • 增加的标签
    标签 描述
    header 定义文档头部
    footer 定义文档尾部
    nav 定义文档导航
    section 定义区块
    article 定义页面独立的内容区域
    aside 定义边栏
    details 定义文档描述细节
    summary 标签包含details元素标题
    dialog 定义对话框,比如提示框
    canvas 用于绘画的标签
    audio 音频播放
    video 视频播放
    • 增强型表单type
    输入类型 描述
    color 选取颜色
    date 从一个日期选择器选取一个日期
    datetime 选择一个日期(UTC时间)
    datetime-local 选择一个日期和时间(无时区)
    email 包含一个邮件地址输入域
    month 选择一个月份
    number 数值的输入域
    range 一定范围内的数字值输入域
    search 用于搜索域
    tel 定义输入电话字段
    time 选择一个时间
    url URL地址的输入域
    week 选择周和年
    • 新增表单属性
    属性 描述
    placeholder 输入框提示灰色字
    required boolean属性,要求输入域不为空
    pattern 描述了一个正则用于验证input值
    min和max属性 设置了元素的最小值最大值
    step 为输入域规定合法数字间隔
    height和width 用于image类型input图像高度宽度
    autofocus boolean属性,页面加载自动获得焦点
    multiple boolean属性,规定input元素可选择多个值

    5. canvas动画

    标签只是容器,必须用js来绘制图形

    // 创建画布标签
    <canvas id="myCanvas" width="200px" height="200px" style="1px solid red"></canvas>
    

    js才能绘图

    <script>
        var myCanvas = document.getElementById("myCanvas");
        var ctx = myCanvas.getContext('2d');
        ctx.fillStyle = "blue";
        ctx.fillRect(0,0,150,75)
        
    </script>   
    

    CSS

    1. 两种盒模型,浏览器内核

    盒模型 结构
    W3C标准盒模型

    2. 实现垂直居中

    3. flex怎么用

    <div class='container'>
        
    </div>
    

    4. BFC是啥

    举例

    5. css优先级

    选择器 符号
    id #idName
    class .classname
    相邻选择器 ul+div
    子选择器 ul>div
    后代选择器 ul div
    通配符 *
    属性选择器 a[href='xxx']
    伪类选择器 a:after a:hover

    6. 清楚浮动

    .clearfix {
        content: '';
        display: block;
        clear: both;
    }
    

    JavaScript题目

    1. ES6新特性

    2. Promise、Promise.all、Promise.race分别怎么用

    3.必考:手写函数防抖和函数节流

    函数防抖和函数节流,都是优化高频率执行js代码的一种手段

    函数节流实际应用场景,多数为监听页面元素滚动事件,示例代码

    // 函数节流
    var canRun = true;
    document.getElementById("throttle").onscroll = function (){
        if (!canRun){
        // 判断状态是否空闲,如果在执行中,直接return
            return;
        }
        canRun = false;
        setTimeout(function(){
            console.log('函数节流');
            canRun = true
        }, 300);
    }
    

    函数防抖是指对于事件被触发的一段时间后再进行的回调,如果这段时间又重新被触发,重新开始计时,适用于

    • 表单组件输入内容的验证
    • 多次点击导致的表单多次提交优化
    // 函数防抖
    function debounce(fn, wait) {
        var timer = null;
        return function(){
            var context = this
            var args = arguments
            if (timer) {
                clearTimeout(timer);
                timer = null;
            }
            timer = setTimerout(function(){
                fn.apply(context, args)
            }, wait)
        }
    }
    var fn = function (){
        console.log('boom')
    }
    setInterval(debounce(fn, 500), 1000)
    

    4.必考:手写AJAX

    var request = new XMLHttpRequest();
    request.open('GET','/xxxx')
    request.onreadystatechange = function () {
        if (request.response.status >= 200 && request.response.status < 300){
        console.log('请求成功')
        }else {
            console.log('请求失败')
        }
    }
    request.send()
    

    5.必考:这段代码里的 this 是什么?

    1. fn()
      this => window/global
    2. obj.fn()
      this => obj
    3. fn.call(xx)
      this => xx
    4. fn.apply(xx)
      this => xx
    5. fn.bind(xx)
      this => xx
    6. new Fn()
      this => 新的对象
    7. fn = ()=> {}
      this => 外面的this

    6.必考:闭包/立即执行函数是什么?

    7.必考:什么是 JSONP,什么是 CORS,什么是跨域?

    8.常考:async/await 怎么用,如何捕获异常?

    9.常考:如何实现深拷贝?

    1. 递归
    2. 判断类型
    3. 检查循环引用(环)
    4. 不可能拷贝原型proto

    10.常考:如何用正则实现 trim()?

    function trim(string){
        return string.replace(/^\s+|\s+$/g,'')
    }
    

    11.常考:不用 class 如何实现继承?用 class 又如何实现?

    function Animal(){
        this.a = 1
    }
    Animal.prototype.move = function(){}
    
    function Dog(){
        Animal.apply(this, arguments)
        this.d = 2
    }
    
    let f = function(){}
    f.prototype = Animal.prototyoe
    Dog.prototype = new f()
    
    Dog.prototype.constructor = Dog
    
    Dog.say = function(){}
    
    class Dog extends Animal{
        constructor(){
            super()
        }
    }
    

    12.常考:如何实现数组去重?

    1. hash
    2. [...new Set(array)]
    3. WeakMap

    13.放弃:== 相关题目(反着答)

    14.送命题:手写一个 Promise

    
    

    15.js垃圾回收机制

    window永远不会是垃圾,页面所有属性都挂载在window上面,全局变量
    对象如果没有被引用,将会成为垃圾被回收,即使引用别人也不行

    孤岛机制,环引用中 family=null 剩下的互相引用也会成为垃圾

    垃圾回收机制 会从全局变量向下找,引用的对象会mark出来,全部mark之后,会将没有mark的部分视为垃圾清除
    被成为 标记-清除算法(mark-sweep)
    js为单线程,每次标记的时候会中断js的代码,
    三种优化:

    1. new代 old代
    2. 增量执行,分批多次执行
    3. 空闲时间执行

    引用计数算法

    DOM面试题

    1. 事件委托

    ul.addEventListener('click', function(e){
        if(e.target.tagName.toLowerCase() === 'li'){
            fn()//执行某个函数
        }
    })
    

    bug: 如果li里面有span被点击 无法穿透到li标签监测到被点击

    function delegate(element, eventType, selector,fn) {
        element.addEventListener(eventType, e => {
            let el = e.target
            while(!el.mathes(selector)){
                if(element === el) {
                    el = null
                    break
                }
                el = el.parentNode
            }
            el & fn.call(el, e, el)
        })
        return element
    }
    

    这里思路为,点击span后,递归遍历span的祖先元素查看有没有ul里面的li,适用的事件 click,mousedown,mouseup,keydown,keyup,keypress。

    2. 实现一个可拖拽的div

    HTML

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">
      <title>JS Bin</title>
    </head>
    <body>
    <div id="xxx"></div>
    </body>
    </html>
    

    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;
    
    moveDiv.addEventListener('mousedown',function(e){
      dragging = true;
      position = [e.clientX,e.clientY]
    })
    
    document.addEventListener('mousemove',function(e){
      if(dragging === false){
        return
      }
      const x = e.clientX;
      const y = e.clientY;
      const newX = x - position[0];
      const newY = y - position[1];
      // 因为left top 自带px,需要转化成数字
      const numLeft = parseInt(moveDiv.style.left || 0);
      const numTop = parseInt(moveDiv.style.top || 0);
      moveDiv.style.left = numLeft + newX + 'px';
      moveDiv.style.top = numTop + newY +'px';
      position = [x,y]
      console.log(position)
    })
    
    document.addEventListener('mouseup',function(){
      dragging = false;
    })
    

    HTTP题目

    1. HTTP状态码有哪些?分别是什么意思

    • 2xx 表示成功
    • 3xx 表示需要进一步操作
    • 4xx 浏览器方面出错
    • 5xx 表示服务器方面出错

    2. HTTP缓存有哪几种

    Etag、CacheControl、Expires的异同

    详情

    相关文章

      网友评论

          本文标题:面试题汇总

          本文链接:https://www.haomeiwen.com/subject/rimnoqtx.html