• 面试中遇到的原生js题总结


    最近面试,遇到很多js相关的面试题,总结一下。

    1、js 去重

    1. indexOf
    Array.prototype.unique = function(){
    	var result = [];
    	var len = this.length;
    	for(var i = 0; i<len; i++){
    		if(result.indexOf(this[i])<0){
    			result.push(this[i]);
    		}
    	}
    	return result;
    }
    var arr = [1,2,3,2,1,3,2,1];
    arr.unique();//arr = [1,2,3]
    
    • 在IE6、7、8不支持indexOf方法,可以在Array原型链上扩展indexOf方法
    if(!Array.prototype.indexOf){    
       Array.prototype.indexOf = function(val){    
           var value = this;    
           for(var i =0; i < value.length; i++){    
              if(value[i] == val) return i;    
           }    
          return -1;    
       };    
    }  
    

    2)数组先排序

    Array.prototype.unique = function(){
    	this.sort();
    	var result = [this[0]];
    	var len = this.length;
    	for(var i = 0; i<len; i++){
    		if(this[i] !== result[result.length-1]){
    			result.push(this[i]);
    		}
    	}
    	return result;
    }
    var arr = [1,2,3,2,1,3,2,1];
    arr.unique();//arr = [1,2,3]
    

    3)ES6新方法set和Array.from

    function unique(arr){
      return Array.from(new Set(arr));
    }
    
    • set是一种新的数据结构,它可以接收一个数组或者是类数组对象,自动去重其中的重复项目,返回的是json对象
    • Array.from可以把类数组对象、可迭代对象转化为数组

    2、js 字符串转为驼峰法

    function tansform(str){
    	var re = /-(w)/g;
    	return str.replace(re,function($0,$1){//replace 中正则表达式$0,$1,$n等代表正则表达式内小括号的匹配值,从$1开始,$0代表正则表达式的整体值
    		return $1.toUpperCase();
    	});
    }
    var str = 'border-left-color';
    tansform(str);//borderLeftColor
    

    3、查找字符串中最多的字符及个数

    function repeatCharNum(str){
    	var arr = str.split('');
    	str = arr.sort().join('');
    	var re = /(w)1+/g;
    	var index = 0;
    	var value = '';
    	str.replace(re,function($0,$1){
    		if(index < $0.length){
    			index = $0.length;
    			value = $1 ;
    		}
    	});
    	alert ('最多字符'+value+'出现的次数'+index);
    }
    

    4、编写一个函数,将输入的参数中的数字字符追加为一个数字字符串,参数输入不确定

    function getStrChange(){
      var len = arguments.length;//参数不确定时使用arguments关键字
      var re = /^d+$/;
      var str = '';debugger;
      for(var i =0; i< len; i++){
        if(!(re.test(arguments[i]))){ 
          continue;
        }
        if(i == len-1){
          str = str+arguments[i];
        }else{
          str = str+arguments[i]+',';
        }  
      }
      return str;
    }
    alert(getStrChange('1','a','45','b','3',1));//('1,45,3,1')
    

    5、var和function的预解析问题,以及变量和function的先后顺序的问题

     // 以下代码执行输出结果是什么
        function b () {
            console.log(a);// function a(){}
            var a = 10;
            function a() {};
            a = 100;
            console.log(a);//100
        }
        b();
    
        function c () {
            console.log(a);//function a(){}
            function a() {};
            var a = 10;
            a = 100;
            console.log(a);//100
        }
        c();
    
        (function d (num) {
            console.log(num);//100
            var num = 10;
        }(100))
    
        (function e (num) {
            console.log(num);//function num () {};
            var num = 10;
            function num () {};
        }(100))
    
        (function f (num) {
            function num () {};
            console.log(num);//function num () {};
            var num =10
            console.log(num);//10
        }(100))
    
        //仍然是预解析(在与解析过程中还要考虑一下当前变量的作用于)
        function m () {
            console.log(a1); // underfined
            console.log(a2); // underfined
            console.log(b1); // underfined
            console.log(b2); // underfined
            if(false) {
                function b1 (){};
                var a1 = 10;
            }
            if(true) {
                function b2 (){};
                var a2 = 10;
            }
            console.log(a1); // underfined
            console.log(a2); // 10
            console.log(b1); // underfined
            console.log(b2); // function
        }
        m();
    
        function n() {
            if(2>1) {
                arr = 10;
                brr = 10;
                let arr;//要在严格模式'use strict'下运行
                var brr;
                console.log(arr);
                console.log(brr);
            }
        }
        n(); // ReferenceError
    
    • 函数声明:function a(){}可以提前解析;
    • 函数表达式:var b = function a(){} : 命名函数表达式
      var b = function (){} :匿名函数表达式
      (function a(){}) : 表达式
      位运算符:(为了区分函数表达式和函数声明)
      ~funtion a(){} : 表达式
      -funtion a(){} : 表达式
      +funtion a(){} : 表达式
      !funtion a(){} : 表达式
      (不可以被提前解析)
    • 函数表达式和函数声明的区别:函数声明可以提前被解析,函数表达式不可以,需要在引用前提前声明;函数表达式可以直接后面加括号执行,函数声明不可以。
    • let关键字要在严格模式'use strict'下运行

    6、判断数据类型

       function gettype(nm){
        return Object.prototype.toString.call(nm);
    } 
       console.log(gettype(3)); //[object number]
    
    • js基础数据类型:number string null undefined string boolean,存放在栈内存
    • js引用数据类型:Object (Array,Date,RegExp,Function),存放在堆内存

    7、如何将arguments转为array

    function changeArg(arguments){
    	return Array.prototype.slice.apply(arguments);
    }
    

    8、如何判断array对象
    可以使用Array.isArray()或者Object.prototype.toString.call()判断

    9、原生dom实现删除dom结点

    function deleteNode(node){
    	if(!node) return;
    	if(node.parentNode){
    		node.parentNode.removeChild(node);
    	}
    }
    

    10、给button绑定click事件

    var x = document.getElementById("myBtn");
    if (x.addEventListener) {                    //所有主流浏览器,除了 IE 8 及更早 IE版本
        x.addEventListener("click", myFunction);
    } else if (x.attachEvent) {                  // IE 8 及更早 IE 版本
        x.attachEvent("onclick", myFunction);
    }
    
    • 还可以用onclick()绑定,但是onclick()混合了js和html,不建议使用。
    • addEventListener("click", function,useCapture),useCapture默认false,代表事件冒泡阶段执行,true代表事件捕获阶段执行。
    • addEventListener和onclick的区别:addEventListener可以添加多个事件,不会被覆盖;onclick只可以一个事件,重复添加,后面一个会覆盖前面一个的事件。

    11、排序算法
    1)冒泡排序

    function bubbleSort(arr){
      for(var i = 0;i< arr.length-1;i++){
        for(j=i+1;j<arr.length;j++){
          if(arr[i]>arr[j]){
            var temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
          }
        }
      }
      return arr;
    }
    

    2)快速排序

    function quickSort(arr){
      if(arr.length<=1){
        return arr;
      }
      var len = Math.floor(arr.length/2);
      var cur = arr.splice(len,1);
      var left = [];
      var right = [];
      for(var i=0;i<arr.length;i++){
        if(cur>arr[i]){
          left.push(arr[i]);
        }else{
          right.push(arr[i]);
        }
      }
      return quickSort(left).concat(cur,quickSort(right));
    }
    
  • 相关阅读:
    python3读取chrome浏览器cookies
    python通过Cookie跳过登录验证码
    Python 正则表达式模块 (re) 简介
    python抓取bing主页背景图片
    python的开发环境配置-Eclipse-PyDev插件安装
    Windows环境selenium+Python环境配置
    Java+Jmeter接口测试
    Jmeter接口测试参数化实例图文示例
    Jmeter接口测试实例图文示例
    单元测试-代码覆盖率 EclEmma
  • 原文地址:https://www.cnblogs.com/yihen-dian/p/8700398.html
Copyright © 2020-2023  润新知