• web前端面试题记录


    笔者近期在找工作,偶遇到一家,广州9-14k的web前端面试,面试过程中是由面试官手写题目,要求现场回答,特此记录,简历上写的是熟悉vue和小程序,出的题目基本上和vue相关的较多,乘着还有点记忆,赶紧记录下来

    题设1:你知道怎么在小程序上内嵌网页吗,现在有一个需求,现在小程序页面上有一个内嵌网页,此时点击分享小程序,如何让网页知道小程序已经分享成功?

    我的回答是只知道小程序可以用webview去实现网页嵌入小程序,但是在实际项目中没有使用过相关的运用。

    说到webview如何知道小程序已经分享成功,我当时想到的方法比较沙雕,我居然想到在在点击分享按钮的时候,此时让网页发送websocket请求给服务端监听是否分享成功,这种方式可行方式能不能行不说,而且还消耗服务器资源,算是一种比较烂的方法把。

    后来问面试官答案,他给我说的解决方法很简单,说是只要在小程序分享的时候控制页面的显示隐藏即可,好吧~

    题目2:知道数组的sort方法吗?讲一讲。

    回答:知道,arr,sort((a,b)=>return a-b  or b-a    a-b是升序排列,b-a是降序排列

    面试官继续问,那你知道为什么a-b是从小到大,b-a是从大到小吗?

    我陷入了沉默。。果然只知道背是没用的,后来回去查了才知道sort方法是用到冒泡排序,sort方法是先比较第一位数字,第一位相同才比较后一位。

    因为sort()函数使用的是冒泡排序,冒泡排序会重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,一直重复地进行直到说该数列已经排序完成。
    如果a-b>0(即正数)就把a和b的位置交换,也就是较小的一个数会排到前面;
    如果b-a>0就把a和b的位置交换,也就是较大的一个数会排到前面。

    感觉这个知道就好,个人理解就是按照字母表顺序 a为1,b为2。 从小到大排序,反之则从大到小。

    题目3:现在给定一个数组,比如arr = [1,2,3,4,5,6,7,8,9,10],怎么让数组重新乱序排列

    当时没回答出来,现在重新整理一下,面试官告诉了我两种方法

    第一种很简单的方法,新建一个数组,然后for循环随机一个push进去,原数组再删除

     let newArr = []
        let len = arr.length
        for(var i = 0;i<len;i++){
            let index = Math.floor(Math.random()*arr.length) //找到数组下标index
            newArr.push(arr[index]); //将随机出的元素,存放新数组newArr中去
            arr.splice(index,1) //
        }
        console.log(newArr)

    第二种,也是面试官问我的第二个问题,用sort来解决这个问题

    var arr = [1,2,3,4,5,6,7,8,9,10];
        const newArr = arr.sort(()=>{
            return Math.random()>0.5?1:-1    })
        console.log(newArr)

    题目4:css预编译器知道哪些,sass中最常用哪种?

    我的回答:变量 $xx:xx,@each,用&去嵌套

    用map-get去获取($color,key)中的value

    '面试官告诉我还有@mixin这个东西 特此记录一下,学的不精,面试的时候都忘记了之前学过这玩意了, @mixin一般和@include一起用

    用这个mixin确实可以达到css的复用,特别是flex布局,以后会在项目中运用到这个东西。

    题目5:有没有对element-ui进行二次封装过,这个问题很高频,不知道是不是我面试的公司少还是什么的,我已经遇到三家公司问过同一个问题了

    我的回答是没有,之前在公司都是直接调用接口,如果接口和element提供的属性不一样,会去改data,而不会去改element的框架。现在计划一年内写一个自己封装的组件,vue或者react都行,

    后来面试官问我有没有看过一些ui框架库的源码,我说element-ui和color-ui有看过一点点吧,心虚了。

    题目:有对axios库进行二次封装吗?还是直接用?

    我当时回答的是用vue.$prototype.$http = axios ,然后再用this.http去get和post,其实也是挂载一个http而已,根本算不上封装

    后来回家的时候想到当时在做小程序的时候有封装过多个请求加载loading的,就是在发送请求的时候ajax++,在请求完成之后ajax--到0,关闭loading

    然后回去补了关于axios/fetch请求库的封装,这个我在另外一篇博客axios的二次封装和api接口规范里会讲到,这里就不细讲了

    题目6:vue computed计算属性的使用,这个也是很高频。

    曾经被问到如果用表单来做所有权重加起来等于100,应该怎么设计,其实面试官问的是computed计算属性,后面面试官叫我回去搞一下

    大概是这样子的,可以动态新增删除,用computed判断所有inputVal加起来等于100时,disabled为false

    贴上代码:包括每个input的校验

    <template>
        <div>
         <el-form label-width="100px" :model="dynamicValidateForm">
           <el-form-item
              v-for="(item, index) in dynamicValidateForm.Form"
              :label="'input' + (index+1)"
              :key="index"
              :prop="'Form.' + index + '.value'"
              :rules="{required: true, message:`请输入input${index+1}值`, trigger: 'blur'}"
            >
              <el-input  v-model="item.value" style="50%"></el-input>
              <el-button @click.prevent="removeInput(index)" type="danger">删除</el-button>
            </el-form-item>
         </el-form>
          <el-button @click="addInput">新增input框</el-button>
          <el-button type="primary" :disabled="disabled">提交</el-button>
        </div>
    </template>
    <script>
    export default {
        data() {
            return {
              inputValue:null,
              allValue:100,
              dynamicValidateForm:{
                Form:[
                  {value:''}
                ]
              }
              
            };
        },
        computed: {
          disabled(){
            this.inputValue = null
            this.dynamicValidateForm.Form.forEach((item,index)=>{
              this.inputValue += Number(item.value)
            })
            return this.inputValue === 100? false : true
          }
        },
        methods: {
          addInput(){
            this.dynamicValidateForm.Form.push({value:''})
          },
          removeInput(index){
            this.dynamicValidateForm.Form.splice(index,1)
          }
        },
    };
    </script>

    题目6:知道vue的mixins混入吗?

     回答知道一点点,它实现了vue的可复用性,可以全局设置mixin也可以局部设置mixin,但是在查找组件来源的时候比较难找

    // minix.js
    export default {
        data () {
            return {
                name: 'minix',
                minixName: 'minixObj',
                flag: false
            }
        },
        mounted() {
            console.log('minixMounted');
        },
        methods: {
            speak() {
                console.log('this is minix');
            },
            getData() {
                return '100';
            }
        }
    }
    // todo.vue
    import myMinix from './minix';
    
    export default {
        data () {
            return {
                name: 'todo',
                lists: [1, 2, 3, 4]
            }
        },
        
        mounted() {
            console.log('todoMounted');
        },
        minixs: [myMinix], // todo.vue 中声明minix 进行混合
        methods: {
            speak () {
                console.log('this is todo');
            },
            submit() {
                console.log('submit');
            },
        }

    题目7:面试官问你知道函数式编程吗,好吧,我不懂。

    题目8:vue组件属性透传

     这里用到了v-bind=“$attrs”  v-on="$listeners"

  • 相关阅读:
    php中获取各种路径
    大型网站系统架构演化之路
    404、500、502等HTTP状态码介绍
    Linux 查看进程和删除进程
    mysql中FIND_IN_SET的使用方法
    PHP导出Excel 数字末尾变0或小数点解决办法
    PHP API接口测试小工具
    要慎用mysql的enum字段的原因
    mysql 导入&导出sql文件
    Linux下php安装memcache扩展
  • 原文地址:https://www.cnblogs.com/gengzhen/p/14045549.html
Copyright © 2020-2023  润新知