美文网首页
vue面试题(第十天)

vue面试题(第十天)

作者: JuneLau | 来源:发表于2019-07-10 23:59 被阅读0次
    1.简述同步和异步的区别

    同步,是所有的操作都做完,才返回给用户结果。即写完数据库之后,在响应用户,用户体验不好。
    异步,不用等所有操作等做完,就相应用户请求。即先响应用户请求,然后慢慢去写数据库,用户体验较好。

    2.数组去重

    1>利用indexof遍历数组去重

     var arr = [1, 2, 3, 3, 2, 4, 5, 11, 11];
        //定义一个空数组
        var newArr = [];
        for (var i in arr) {
          if (newArr.indexOf(arr[i]) == -1) {
            //判断数组newArr内有没有此元素
            newArr.push(arr[i]);
          }
        }
        console.log(newArr);//[1,2,3,4,5,11]
    

    2>使用es6

    let arr = [56, 78, 45, 56, 78, 90, 90];
        arr = [...new Set(arr)];
        //or
        arr = Array.from(new Set(arr));
        console.log(arr);// [56, 78, 45, 90]
    

    3>相邻元素去重

    function fun1(arr) {
          // Array.isArray判断是否是一个数组
          if (!Array.isArray(arr)) {
            console.log("type error!");
            return;
          }
          arr = arr.sort();
          //console.log(arr);//[1, 1, 2, 2, 234, 3, 3, 35, 4]
          let res = [];
          for (let i = 0; i < arr.length; i++) {
            if (arr[i] !== arr[i - 1]) {
              res.push(arr[i]);
            }
          }
         // console.log(res);//[1, 2, 234, 3, 35, 4]
          return res;
        }
        var arr = [1, 2, 3, 2, 234, 35, 3, 4, 1];
        fun1(arr);
    

    4>利用对象属性去重
    将数组中的值设为对象的属性,并给该属性赋初始值1,每出现一次,对应的属性值增加1,这样属性值就是该元素出现的次数

      function fun1(arr) {
          if (!Array.isArray(arr)) {
            console.log("数组类型错误");
            return;
          }
          //定义一个空数组
          let res = [],
            obj = {};
          for (let i = 0; i < arr.length; i++) {
            // console.log(obj[arr[i]]);
            if (!obj[arr[i]]) {
              res.push(arr[i]);
              obj[arr[i]] = 1;
            } else {
              obj[arr[i]]++;
            }
          }
          //console.log(res);//[1, 2, 3, 234, 35, 4]
          return res;
        }
        var arr = [1, 2, 3, 2, 234, 35, 3, 4, 1];
        fun1(arr);
    
    3.在JavaScript中什么是伪数组?如何将伪数组转化为标准数组

    符合以下条件的对象称为伪数组:

    1,具有length属性
    2,按索引方式存储数据
    3,不具有数组的push,pop等方法

    伪数组(类数组)无法直接调用数组方法或期望length属性有什么特殊的行为,不具有数组的push,pop等方法,但仍可以对真正数组遍历方法来遍历它们(function的arguments对象,还有getElementsByTagName、ele.childNodes等返回的NodeList对象,或者自定义的某些对象,这些都可以是伪数组。)

    通过以下几种方式将伪数组转换为标准数组:
    1、使用Array.prototype.slice.call()或[].slice.call();

    Array.prototype.slice.call({
          0: "Jackson",
          1: 19,
          2: true,
          length: 3
        });
        //["Jackson", 19, true]
    

    2、使用ES6中Array.from方法;

    Array.from({  
     0:"xizige",  
     1:19,  
     2:2019,  
     3:"中戏",  
     length:4  
    });  
    //["xizige", 19, 2019, "中戏"]  
    
    4.SPA路由history模式,打包上线都遇到了哪些问题?你是如何解决的?
    5.JavaScript中callee和caller的作用

    1.callee:对象的一个属性,该属性指向参数arguments对象的函数
    作用:用来指向当前对象

    返回正被执行的 Function 对象,也就是所指定的 Function 对象的正文.
    callee是arguments 的一个属性成员,它表示对函数对象本身的引用,这有利于匿名 函数的递归或者保证函数的封装性。

    //首先来写个阶乘函数  公式:n!=n*(n-1)!
        function fun1(x) {
          if (x <= 1) {
            return 1;
          } else {
            return x * fun1(x - 1);
          }
        }
        //这里用到递归函数(在内部调用),若改变函数名,里面的函数名也要跟着改变
        //用callee来写
        function fun2(x) {
          if (x <= 1) {
            return 1;
          } else {
            return x * arguments.callee(x - 1);
          }
        }
        //callee是arguments对象的一个属性,指向arguments对象的函数,这个函数就是fun1(fun1=arguments.callee)
    

    2.caller函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
      返回一个对函数的引用,该函数调用了当前函数。
      functionName.caller
      functionName 对象是所执行函数的名称。

     //caller是函数对象的一个属性,该属性保存着调用当前函数的函数的引用(指向当前函数的直接父函数)
        function a() {
          b();
        }
        function b() {
          alert(b.caller);
        }
        a();//弹出函数a
        //函数b的属性caller调用当前函数b的函数引用a(就是指向当前函数b的父函数a),所以结果就是弹出 function a(){ b();};
    

    注意:
    对于函数来说,caller 属性只有在函数执行时才有定义。 如果函数是由 Javascript 程序的顶层调用的,那么 caller 包含的就是 null 。

    caller和callee结合使用

     (function a(){
             b()
         })()
    
         function b(){
             alert(argument.callee.caller)
         }
         //argument.callee代替了b函数
    

    应用场景:
    callee的应用场景一般用于匿名函数
    caller的应用场景 主要用于察看函数本身被哪个函数调用

    相关文章

      网友评论

          本文标题:vue面试题(第十天)

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