撩课-Web大前端每天5道面试题-Day18

作者: 撩课学院 | 来源:发表于2018-12-18 10:34 被阅读8次

    1.如何判断一个变量是对象还是数组?

    
    判断数组和对象分别都有好几种方法,其中用prototype.toString.call()兼容性最好。
    
    function isObjArr(variable){
         if (Object.prototype.toString.call(value) === "[object Array]") {
                console.log('value是数组');
           }else if(Object.prototype.toString.call(value)==='[object Object]'){//这个方法兼容性好一点
                console.log('value是对象');
          }else{
              console.log('value不是数组也不是对象')
          }
    }
    
    注意:千万不能使用typeof来判断对象和数组,因为这两种类型都会返回"object"。
    
    

    2.ES5的继承和ES6的继承有什么区别?

    
    ES5的继承时通过prototype或构造函数机制来实现。
    ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上(Parent.apply(this))。
    
    ES6的继承机制完全不同,实质上是先创建父类的实例对象this(所以必须先调用父类的super()方法),然后再用子类的构造函数修改this。
    
    具体的:ES6通过class关键字定义类,里面有构造方法,类之间通过extends关键字实现继承。
    子类必须在constructor方法中调用super方法,否则新建实例报错。
    因为子类没有自己的this对象,而是继承了父类的this对象,然后对其进行加工。如果不调用super方法,子类得不到this对象。
    
    注意:super关键字指代父类的实例,即父类的this对象。在子类构造函数中,调用super后,才可使用this关键字,否则报错。
    
    

    3.如何对一个数组去重?

    
    1、Set结构去重。
    
    这是ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。
    
    let unique= [...new Set(array)];
    //es6 Set数据结构类似于数组,成员值是唯一的,有重复的值会自动去重。
    //Set内部使用===来判断是否相等,类似'1'和1会两个都保存,NaN和NaN只会保存一个
    
    2、遍历,将值添加到新数组,用indexOf()判断值是否存在,已存在就不添加,达到去重效果。
    
        let a = ['1','2','3',1,NaN,NaN,undefined,undefined,null,null, 'a','b','b'];
        let unique= arr =>{
             let newA=[];
            arr.forEach(key => {
               if( newA.indexOf(key)<0 ){ //遍历newA是否存在key,如果存在key会大于0就跳过push的那一步
                 newA.push(key);
               }
            });
            return newA;
        }
        console.log(unique(a)) ;//["1", "2", "3", 1, NaN, NaN, undefined, null, "a", "b"]
    //注意:这个方法不能分辨NaN,会出现两个NaN。是有问题的,下面那个方法好一点。
    
    3、遍历,将数组的值添加到一个对象的属性名里,并给属性赋值,对象不能添加相同属性名,以这个为依据可以实现数组去重,
       然后用Object.keys(对象)返回这个对象可枚举属性组成的数组,这个数组就是去重后的数组。
    
        let a = ['1', '2', '3', 1,NaN,NaN,undefined,undefined,null,null, 'a', 'b', 'b'];
        const unique = arr => {
            var obj = {}
            arr.forEach(value => {
                obj[value] = 0;//这步新添加一个属性,并赋值,如果不赋值的话,属性会添加不上去
            })
            return Object.keys(obj);//`Object.keys(对象)`返回这个对象可枚举属性组成的数组,这个数组就是去重后的数组
        }
        console.log(unique(a));//["1", "2", "3", "NaN", "undefined", "null", "a", "b"]
    
    注意:
    这个方法会将 number,NaN,undefined,null,变为字符串形式,
    因为对象的属性名就是一个字符串,根据需求来吧,想想还是Set去重最简单也最有效
    
    

    4.你有哪些性能优化的方法?

    
          (1) 减少http请求次数:CSS Sprites, JS、CSS源码压缩、图片大小控制合适;网页Gzip,CDN托管,data缓存 ,图片服务器。
    
          (2) 前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数
    
          (3) 用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能。
    
          (4) 当需要设置的样式很多时设置className而不是直接操作style。
    
          (5) 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
    
          (6) 避免使用CSS Expression(css表达式)又称Dynamic properties(动态属性)。
    
          (7) 图片预加载,将样式表放在顶部,将脚本放在底部  加上时间戳。
    
          (8) 避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比      div+css布局慢。
                对普通的网站有一个统一的思路,就是尽量向前端优化、减少数据库操作、减少磁盘IO。
                向前端优化指的是,在不影响功能和体验的情况下,能在浏览器执行的不要在服务端执行,
                能在缓存服务器上直接返回的不要到应用服务器,程序能直接取得的结果不要到外部取得,
                本机内能取得的数据不要到远程取,内存能取到的不要到磁盘取,缓存中有的不要去数据库查询。
                减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成  (例如join查询),
                减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分,换语言是无法“优化”的。
    
    

    5.请用js去除字符串空格?

    
    方法一:使用replace正则匹配的方法
    去除所有空格: str = str.replace(/\s*/g,"");      
    
    去除两头空格: str = str.replace(/^\s*|\s*$/g,"");
    
    去除左空格: str = str.replace( /^\s*/, “”);
    
    去除右空格: str = str.replace(/(\s*$)/g, "");
    
    str为要去除空格的字符串,实例如下:
    
    var str = " liao ke ";
    var str2 = str.replace(/\s*/g,"");
    console.log(str2); // 2323
    方法二:使用str.trim()方法
    str.trim()局限性:无法去除中间的空格,实例如下:
    
    var str = "   liao ke   ";
    var str2 = str.trim();
    console.log(str2);   //liao ke
    同理,str.trimLeft(),str.trimRight()分别用于去除字符串左右空格。
    
    方法三:使用jquery,$.trim(str)方法
    $.trim(str)局限性:无法去除中间的空格,实例如下:
    
    var str = "   liao ke   ";
    var str2 = $.trim(str)
    console.log(str2);   //  liao ke
    
    
    

    相关文章

      网友评论

        本文标题:撩课-Web大前端每天5道面试题-Day18

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