前端面试题

作者: Howie126313 | 来源:发表于2018-03-20 22:56 被阅读620次

    金三银四,春天来了~又到了跳槽的高峰期。以下是最近面试常问的一些面试题。前端新人一枚,问题都比较基础。

    首先推荐个 chrome 的插件吧,在去一个公司面试前不知道他的技术栈是什么,可以通过浏览他的网站通过这个插件看看这个公司都用了什么。也可以有一个方向去准备。如果有童鞋因为墙的问题的话~~
    戳这里:https://github.com/Howie126313/vpn

    Javascript:

    Q1:用到的 ES6 新特性。
    A:
    1、箭头函数;(可以避免 this 指向问题)
    2、模板字符串;
    3、扩展运算符;
    4、设置函数默认值;
    5、class 声明类及相关继承的方法;
    6、@functionName 类的修饰器;

    Q2:计算 1-10000 出现过多少个 0 。
    A:

    !function () {
        let num = 0
        const rule = /0/g
        for (let i = 1; i <= 10000; i++) {
             if(i.toString().includes(0)){
                if (i.toString().match(rule)) {
                    num += i.toString().match(rule).length
                }
             }
        }
        console.log(num)
    }()
    

    Q3:以下代码分别输出值是什么 。
    A:

    !function () {
        for (var i = 0; i < 5; i++) {
            console.log(i)
        }
        console.log(i);
    }()
    
    !function () {
        for (let i = 0; i < 5; i++) {
            console.log(i)
        }
        console.log(i);
    }()
    

    Q4:typeof 和 instanceof 区别。
    A:
    typeof 的返回值为‘number’,‘string’,’boolean’,’function’,’undefined’,’object’。所以在判断数组时,返回值为 ‘object’;
    instanceof 是判断变量是否为某个对象的实例,返回值布尔值。
    e.g:

    var o = {};
    var a = [];
    
    o instanceof Array // false
    a instanceof Array // true
    a instanceof Object // true
    

    Q5:for 、for…in 相对于 for…of 的缺点。
    A:

    • for 书写麻烦...(我也不知道 _ )
    • for…in: 遍历顺序不确定,for…in不光能遍历数组还能遍历对象,因此在遍历数组内值得同时,还会遍历数组自身的属性以及数组原型链上的可枚举属性;
    • for..of (ES6): 可以使用 break 来终止整个循环,或者 continute 来跳出当前循环,继续后面的循环;结合 key() 获取到循环的索引,并且是数字类型,不是字符串类型;

    Q6:同时发送多个异步请求,请求之前没有关联。
    A:使用 aync 、await 发送,声明三个请求,之后通过 promise.all() 一起发送,此时三个请求为并行。如果直接发送,三个请求会以串行的方式发送。
    有关 aync 、 await 异步请求的详细教程:https://segmentfault.com/a/1190000011526612
    e.g:

    async function correctDemo() {
        let p1 = sleep(1000);
        let p2 = sleep(1000);
        let p3 = sleep(1000);
        await Promise.all([p1, p2, p3]);
    }
    

    Q7: 使用 Jquery 获取 select 当前的 value 值。
    A: $("select option: selected").val();

    Q8:JQuery 中 符号的冲突问题。 A:使用 jQuery.noConflict([extreme]) 释放 给其他 js 库。释放后,可能会引起 jqExtend 工作不正常。
    e.g:

    var $jq = jQuery.noConflict(true);
    

    Q9: 正则相关。
    A:
    元字符:
    1、.:匹配除了\n所有字符;
    2、\d:匹配所有的数字0-9;
    3、\w:匹配数字、字母、下划线;
    4、\s:匹配所有空白占位符;
    5、\D:匹配所有的非数字;
    6、\W:匹配所有的非数字、字母、下划线;
    7、\S:匹配所有非空白占位符;
    8、\u:匹配中文;
    匹配所有的中文:[\u4e00-\u9fa5]
    注意:\代表转译,一些带有特殊意义的字符,需要转译;(\n代表换行)

    括号:
    ():标记一个子表达式的开始和结束位置;
    []:代表一个区间,定义字符的匹配范围;
    \d===[0-9];
    \w===[a-z0-9A-Z];
    \D===[^0-9];
    \w===[^a-z0-9A-Z];
    ^代表区间取反;

    {}:表示匹配长度;
    n{x}:x个n;
    n{x,y}:最少x个n,最多y个n;
    n{x,}:最少x个n,最多无限;

    量词:
    +:最少一个,最多无限个{1,};
    *:最少0个,最多无限个{0,
    ?:最少0个,最多1个{0,1}

    Q10:跨域
    A:浏览器的同源策略会导致跨域,只要是为了防止 CSRF 攻击。只要协议、域名和端口有任何一个不同就被当做是跨域操作。解决方法:jsonp、服务器代理、设置 webpack 中 proxytable 或者 iframe 等方式。

    Q11:数据类型
    A:基本数据类型:number string boolean undefined null;引用数据类型:object function array data

    css3:

    Q1:实现三栏布局,左右定宽中间自适应。(三种方式)
    A:
    1、flex:

    <head>
        <style>
            .wrap {
                display: flex;
                background-color: yellowgreen;
            }
            .t1 {
                width: 200px;
                height: 100px;
                background-color: red;
            }
            .t2 {
                flex: 1;
                height: 100px;
                background-color: blue;
            }
            .t3 {
                width: 200px;
                height: 100px;
                background-color: hotpink;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="t1">left</div>
            <div class="t2">center</div>
            <div class="t3">right</div>
        </div>
    </body>
    

    2、grid:

    <head>
        <meta charset="UTF-8">
        <title>Title</title>
        <style>
            .wrap {
                display: grid;
                grid-template-columns: 200px 1fr 200px;
            }
            .wrap>div {
                height: 200px;
            }
            .t1 {
                background-color: aqua;
            }
            .t2 {
                background-color: hotpink;
            }
            .t3 {
                background-color: yellowgreen;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="t1">left</div>
            <div class="t2">center</div>
            <div class="t3">right</div>
        </div>
    </body>
    

    3、 position:

    <head>
        <style>
            .wrap {
                background-color: aqua;
                padding: 20px;
                position: relative;
            }
            .t1 {
                position: absolute;
                left: 0;
                top: 0;
                width: 200px;
                height: 100px;
                background-color: blue;
            }
            .t2 {
                height: 100px;
                background-color: brown;
                margin: 0 220px;
            }
            .t3 {
                position: absolute;
                right: 0;
                top: 0;
                width: 200px;
                height: 100px;
                background-color: black;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="t1">left</div>
            <div class="t2">center</div>
            <div class="t3">right</div>
        </div>
    </body>
    

    4、float:

    <head>
        <style>
            .wrap {
                background-color: aqua;
                overflow: hidden;
                padding: 20px;
            }
            .d1 {
                width: 200px;
                height: 100px;
                float: left;
                background-color: brown;
            }
            .d2 {
                width: 200px;
                height: 100px;
                float: right;
                background-color: blueviolet;
            }
            .d3 {
                height: 100px;
                background-color: blue;
                margin-left: 200px;
            }
        </style>
    </head>
    <body>
        <div class="wrap">
            <div class="d1">left</div>
            <div class="d2">right</div>
            <div class="d3">center</div>
        </div>
    </body>
    

    Q2:常用清楚浮动的方法,为什么 overflow 能够清楚浮动?BFC 是什么?哪些属性能够触发 BFC ?
    A:
    清楚浮动的方法:

    • 使用伪元素;
    • 在浮动元素下,写一个空的 div 设置 clear: both 属性;
    • 父级设置浮动;
    • 父级设置 overflow: hidden/auto ;

    为什么 overflow 能够清除浮动:
    因为 overflow 的属性值出发了 BFC 。

    BFC 是什么:
    BFC 全称是块级排版上下文,用于对块级元素排版。BFC 会生成一个区域,使这个块圾元素内部的排版完全独立隔绝。就好像声明了一个 function 就会生成 一个独立的作用域一样。

    那些属性能够触发 BFC :
    float 的值不为 none ;
    overflow 的值不为 visible ;
    display 的值为 inline-block、table-cell、table-caption
    position 的值为 absolute 或 fixed。

    Vue:

    Q1: vue 双向数据绑定是如何实现的。
    A:vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,利用 Object.defineProperty() 实现了数据的劫持。ES6 的 proxy 也可以实现相应的效果,但兼容性不如前者。
    具体方法:https://www.cnblogs.com/canfoo/p/6891868.html

    Q2:vue 计算属性的实现,computed 和 watch 区别。
    A:计算属性也是通过 Object.defineProperty() 和发布者-订阅者模式实现的;
    computed:经过处理返回的数据值,只要源数据没有发生改变,computed函数里面对相应的数据就不会反生改变,相当于缓存在本地;发生改变的时候,computed对应数据的函数也会发生改变;
    watch:watch比较适合对状态的监控,比如监控页面一个变量的值改变,需要进行什么操作,而不只是简单的返回一个值。

    Q3:vue 常用的生命周期,各周期都做了什么。
    A:
    beforeCreate:
    组件实例被创建,对 data 进行双向绑定,初始化方法;
    created :
    组件实例创建完成,属性已绑定,dom 还未生成。将模板编译成函数;运行 render 方法返回一个 vnode 对象(虚拟dom);
    beforeMount:
    此时 el 还未对数据进行渲染;
    mounted:
    el 被新建的 vm.$el替换,并挂载到实例上;
    beforeUpdate:
    数据更新时调用,新 dom 渲染之前。这里适合在更新前访问现有的 dom;
    Updated:
    数据更新导致虚拟 dom 重新渲染;
    beforeDestory:
    实例销毁之前,实例仍然完全可用;
    destoryed:
    vue 实例销毁后调用,实例指示的所有东西都会解绑定,事件监听也会被移除,子实例也会被销毁;

    Q4:vue 组件间传值。
    A:

    • 通过 prop 和 $emit 方法在父子级组件间进行传值;
    • 通过 eventBus 进行组件间传值;
    • 使用 Vuex;
    • 通过 $ref 获取组件实例,调用该组件方法时,使用参数传值;
    • 使用作用域插槽;

    Q5:原生 Javascript 实现简单的 vue 双向数据绑定。
    A:实现方式,利用 Object.defineProperty 或 ES6 的 proxy 实现。前者兼容性更好。

    • Object.defineProperty:
    <body>
        <input id="input" type="text">
        <p id="output"></p>
    </body>
    <script>
        var data = {}
        Object.defineProperty(data, 'words', {
            set: function(newval) {
                document.getElementById('input').value = newval
                document.getElementById('output').innerHTML = newval
            }
        });
        document.addEventListener('keyup', function(e) {
            data.words = e.target.value
        })
    </script>
    

    Q6: 关于服务端渲染
    A:服务器端渲染(SSR),基于 react 的渲染框架 next.js 以及基于 vue 的 nuxt.js。SSR 对于首屏加载时间的优化很明显,同时还可以方便的进行 SEO (google 不需要)。

    其他:

    Q1:网页优化。
    A:这就是个坑~说不完.....看这里https://segmentfault.com/a/1190000011554027

    Q2:websocket 是什么。
    A:类似一个即时通讯的效果,正常 ajax 需要我们发送请求,后台才会返回数据。websocket 是一次连接之后,如果不去断开,连接不会中断。当服务器数据发生变化时,后台会向前台发送数据。常用的 socket.io 是一个封装了 Websocket、基于 Node 的 JavaScript 框架,包含 client 的 JavaScript 和 server 的 Node。
    详细介绍:https://zhuanlan.zhihu.com/p/23467317

    Q3:Cookie、localStorage、sessionStorage 的区别
    A:
    cookie 一般由服务器生成,可设置失效时间。如果在浏览器端生成Cookie,默认是关闭浏览器后失效,存放数据大小一般4K左右,而sessionStorage与localStorage大小在5兆左右,在客户端生成,localStorage除非被清除,否则会永久保存,sessionStorage仅在当前会话下有效,关闭页面或浏览器后被清除,cookie在与服务器端通信每次都会携带在HTTP头中,如果使用cookie保存过多数据会带来性能问题,而sessionStorage与localStorage仅在客户端(即浏览器)中保存,不参与和服务器的通信。
    参考:http://jerryzou.com/posts/cookie-and-web-storage/

    Q4:打开网页浏览器都做了什么
    A:使用 html 创建 dom,使用 css 创建 css 对象模型,基于这两者执行脚本(scripts)。合并 dom 和 css 对象模型形成渲染树,使用渲染书布局所有元素。然后渲染所有元素。

    Q5:webpack url-loader 和 file-loader 区别
    A:file-loader 解析项目中 url 引入,根据配置将图片拷贝到相应的路径;再根据配置,修改打包后文件的引用路径,使其指向正确的文件。url-loader 简单的说,他封装了 file-loader,但不依赖 file-loader。url-loader 的工作分两种:1)文件小于 limit 的值, 将其转为 DataURL。相当于把图片翻译成字符串打包到文件中,但图片较大会影响性能;2)大于 limit url-loader 会调用 file-loader 进行处理。

    相关文章

      网友评论

        本文标题:前端面试题

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