美文网首页
前端常见面试题及详解

前端常见面试题及详解

作者: pauljun | 来源:发表于2017-03-15 17:05 被阅读0次

    1、js有哪些数据类型

    基本数据类型:String,Boolean, Number, Null, Undefined
    引用数据类型:Obeject(Array,Date,RegExp,Function)
    //那么问题来了,如何判断某变量是否是数组类型
    1、判断其是否具有"数组性质",如slice()。可自己给该变量定义slice方法,故有时会失效
    2、obj instanceof Array 在某些IE版本中不正确(但是经过测试,未发现不兼容问题)
    3、在ECMA Script5中定义了新方法Array.isArray(),但是此方法不兼容ie8,为了更好的兼容浏览器,可如下处理:

    //定义变量
    var arr = ['0','1','2'];
    
    //判断浏览器是否支持isArray方法,Array.isArray === undefined,则浏览器不支持此方法
    if(typeof Array.isArray === "undefined"){
        //定义方法
        Array.isArray = function(arg){
            //Object.prototype.toString.call()方法可查看http://www.zhufengpeixun.cn/JavaScriptmianshiti/2014-02-28/271.html
            return Object.prototype.toString.call(arg) === "[object Array]";
        };
    };
    
    console.log(Array.isArray(arr));     -->true
    

    2、如果一个div,宽度为100px,padding-top:20%,试问这个元素的高度是多少。

    所有元素的padding margin 百分比都跟其父元素的宽度有关,对应的比例是其父元素宽度的比例。

        <div style="width:200px;">
            <div style="width: 100px;padding-top: 20%;"></div>
        </div>
        //如父级元素div宽度为200px;那么子级元素div的高度为200*20%=40px;
    

    3、什么是ajax,以及ajax常见状态码

    Ajax是异步JavaScript和XML,用于在Web页面中实现异步数据交互。

    XMLHttpRequest,status:
    1xx-信息提示 这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接受衣一个或多个1xx响应。
    100-继续
    2xx-成功
    这类状态代码表明服务器成功地接受了客户端请求。 
    200-确定。客户端请求已成功。 
    201-已创建。 
    202-已接受。 
    203-非权威性信息。 
    204-无内容。 
    205-重置内容。 
    206-部分内容。 
    3xx-重定向 
    客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 
    301-对象已永久移走,即永久重定向。 
    302-对象已临时移动。 
    304-未修改。 
    307-临时重定向。 
    4xx-客户端错误 
    发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。400-错误的请求。 
    401-访问被拒绝。IIS定义了许多不同的401错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在IIS日志中显示: 
    401.1-登录失败。 
    401.2-服务器配置导致登录失败。 
    401.3-由于ACL对资源的限制而未获得授权。 
    401.4-筛选器授权失败。 
    401.5-ISAPI/CGI应用程序授权失败。 
    401.7–访问被Web服务器上的URL授权策略拒绝。这个错误代码为IIS6.0所专用。 
    403-禁止访问:IIS定义了许多不同的403错误,它们指明更为具体的错误原因: 
    403.1-执行访问被禁止。 
    403.2-读访问被禁止。 
    403.3-写访问被禁止。 
    403.4-要求SSL。 
    403.5-要求SSL128。 
    403.6-IP地址被拒绝。 
    403.7-要求客户端证书。 
    403.8-站点访问被拒绝。 
    403.9-用户数过多。 
    403.10-配置无效。 
    403.11-密码更改。 
    403.12-拒绝访问映射表。 
    403.13-客户端证书被吊销。 
    403.14-拒绝目录列表。 
    403.15-超出客户端访问许可。 
    403.16-客户端证书不受信任或无效。 
    403.17-客户端证书已过期或尚未生效。 
    403.18-在当前的应用程序池中不能执行所请求的URL。这个错误代码为IIS6.0所专用。 
    403.19-不能为这个应用程序池中的客户端执行CGI。这个错误代码为IIS6.0所专用。 
    403.20-Passport登录失败。这个错误代码为IIS6.0所专用。 
    404-未找到。 
    404.0-(无)–没有找到文件或目录。 
    404.1-无法在所请求的端口上访问Web站点。 
    404.2-Web服务扩展锁定策略阻止本请求。 
    404.3-MIME映射策略阻止本请求。 
    405-用来访问本页面的HTTP谓词不被允许(方法不被允许) 
    406-客户端浏览器不接受所请求页面的MIME类型。 
    407-要求进行代理身份验证。 
    412-前提条件失败。 
    413–请求实体太大。 
    414-请求URI太长。 
    415–不支持的媒体类型。 
    416–所请求的范围无法满足。 
    417–执行失败。 
    423–锁定的错误。 
    5xx-服务器错误 
    服务器由于遇到错误而不能完成该请求。 
    500-内部服务器错误。 
    500.12-应用程序正忙于在Web服务器上重新启动。 
    500.13-Web服务器太忙。 
    500.15-不允许直接请求Global.asa。 
    500.16–UNC授权凭据不正确。这个错误代码为IIS6.0所专用。 
    500.18–URL授权存储不能打开。这个错误代码为IIS6.0所专用。 
    500.100-内部ASP错误。 
    501-页眉值指定了未实现的配置。 
    502-Web服务器用作网关或代理服务器时收到了无效响应。 
    502.1-CGI应用程序超时。 
    502.2-CGI应用程序出错。application. 
    503-服务不可用。这个错误代码为IIS6.0所专用。 
    504-网关超时。 
    505-HTTP版本不受支持。 
    

    4、看下列代码输出为何?解释原因。

    var a;
    alert(typeof a); // undefined
    alert(b); // 报错
    
    // 解释:Undefined是一个只有一个值的数据类型,这个值就是“undefined”,在使用var声明变量但并未对其赋值进行初始化时,这个变量的值就是undefined。而b由于未声明将报错。注意未申明的变量和声明了未赋值的是不一样的。
    
    var a = null;
    alert(typeof a); //object
    
    // 解释:null是一个只有一个值的数据类型,这个值就是null。表示一个空指针对象,所以用typeof检测会返回”object”
    

    5、看下面的代码,输出什么,foo的类型为什么?

    var foo = "11"+2-"1";
    console.log(foo);
    console.log(typeof foo);
    //执行完后foo的值为111,foo的类型为Number。
    
    var foo = "11"+2+"1";    //体会加一个字符串'1' 和 减去一个字符串'1'的不同
    console.log(foo);
    console.log(typeof foo);
    //执行完后foo的值为1121(此处是字符串拼接),foo的类型为String。
    

    6、var numberArray = [3,6,2,4,1,5]; (考察基础API)

    1. 实现对该数组的倒排,输出[5,1,4,2,6,3]
    1. 实现对该数组的降序排列,输出[6,5,4,3,2,1]
    var numberArray = [3,6,2,4,1,5];
    numberArray.reverse(); // 5,1,4,2,6,3
    numberArray.sort(function(a,b){  //6,5,4,3,2,1
       return b-a;
    })
    

    7、为了保证页面输出安全,我们经常需要对一些特殊的字符进行转义,请写一个函数escapeHtml,将<, >, &, “进行转义

    function escapeHtml(str) {
    return str.replace(/[<>”&]/g, function(match) {
        switch (match) {
                       case “<”:
                          return “<”;
                       case “>”:
                          return “>”;
                       case “&”:
                          return “&”;
                       case “\””:
                          return “"”;
          }
      });
    }
    

    8、看下面代码,给出输出结果。

    for(var i=1;i<=3;i++){
      setTimeout(function(){
          console.log(i);   
      },0); 
    };
    
    ## 答案是4 4 4
    
    //原因:Javascript事件处理器在线程空闲之前不会运行。那么问题来了,如何让上述代码输出1 2 3?
    
    for(var i=1;i<=3;i++){
       setTimeout((function(a){  //改成立即执行函数
           console.log(a);   
       })(i),0); 
    };
    ## 输出1 2 3
    

    9、如何消除一个数组里面重复的元素?

    ##哈希表去重算法
    var arr = [1, 2, 3, 3, 4, 4, 5, 5, 6, 1, 9, 3, 25, 4];
     
    function deRepeat() {
        var newArr = [];  //newArr为临时数组
        var obj = {};    //obj为hash表
        var index = 0;
        var l = arr.length;
        for (var i = 0; i < l; i++) {
            if (obj[arr[i]] == undefined) {    //如果hash表中没有当前选项
                obj[arr[i]] = 1;                      //存入hash表
                newArr[index++] = arr[i];
            } else if (obj[arr[i]] == 1)          //hash表中有当前选项
                continue;
        }
        return newArr;
     
    }
    var newArr2 = deRepeat(arr);
    alert(newArr2); //输出1,2,3,4,5,6,9,25
    

    10、下面这个ul,如何点击每一列的时候alert其index?(闭包)

    <ul id=”test”>
        <li>这是第一条</li>
        <li>这是第二条</li>
        <li>这是第三条</li>
    </ul>
    

    答案:

    var li = document.getElementsById("test").getElementsByTagName("li");
    ## 方法一
     for(var i = 0;i < li.length; i++){
        li[i].index = i;
        li[i].onclick = function(){
            alert(this.index)
        }
     };
    ## 方法二
    for(var i = 0; i < li.length; i++){
        li[i].index = i;
        li[i].onclick = (function(a){
            return function(){
                alert(a)
            }
        })(i);
    };
    

    11、定义一个log方法,让它可以代理console.log的方法。

    function log(msg){
      console.log("msg");
    };
    
    log('hello world!');
    
    ## 如果要传入多个参数呢?显然上面的方法不能满足要求,所以更好的方法是:
    
    function log() {
        console.log.apply(console, arguments);
    };
    

    那么问题来了,apply和call方法的异同?

    答案:

    对于apply和call两者在作用上是相同的,即是调用一个对象的一个方法,以另一个对象替换当前对象。将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

    但两者在参数上有区别的。对于第一个参数意义都一样,但对第二个参数: apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。 如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3]) 。

    更多详细信息,请参考

    相关文章

      网友评论

          本文标题:前端常见面试题及详解

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