zoukankan      html  css  js  c++  java
  • JavaScript面试题目集锦

    这里是我到处搜集的一些JS题目,看起来比较简单,但对基础知识的考察还是很到位的。

    有一些还可能是面试题。 题目的分析肯定会有不足的地方 ,如果能指正出来的话就再好不过了。不断更新中……

    这里还有几个前端工程师面试题的文章 也一并推荐给大家

    http://www.cnblogs.com/jscode/archive/2012/07/10/2583856.html#2425501

    http://blog.jobbole.com/29269/


    1.

    var length = 9;
    var foo = {
        bar: function() {
            return this.length;
        },
        length: 0
    };
    (function f(a, b) {
        f.length = 3;
        console.log(f.length);//
        console.log(arguments[0]());//
        console.log(a());//
        console.log((foo.bar)());//
        arguments[1]="XXX";
        console.log(b);//
    })(foo.bar ,33,11);

    ①f.length是Function f的形参数量 函数声明之后就不会变化了。
    ②执行时 arguments = [function(){return this.length;} , 33 , 11];
    arguments[0]中的this指向的是arguments对象 而arguments.length 得到的是实参的个数(不管函数声明的时候有几个参数)
    ③a的获得相当于 var a = foo.bar;这时a的调用对象是window 而不是foo 。
    ④(foo.bar)() === foo.bar()这个就不细说了
    ⑤通过arguments能够改变实参的值

    2.

    用(0-9 A-Z a-z)生成任意长度(62位以内)的各个位都不重复的随机字符串

    3.

    function A(){
        alert(this);
        eval('alert(this)');
        (function(){
            alert(this);
            eval('alert(this)');
        })()
    }
    new A()
    分别弹出什么?

    4. 

    function A(){this.x=1;}
    function B(){this.y=2;return "OK";}
    function C(){this.z=3;return Object("OK");}
    问:
    new A();
    new B();
    new C();
    三者分别是什么类型对象?(即用Object.getPrototypeOf(obj)获得的值)
    可参考另一篇文章《JS中用new 创建对象及在构造函数中return的使用

     5.

    <script>
    //① if (!("a" in window)) { var a = 1; } alert(a); //② function f(){ if (!("b" in window)) { var b = 1; } alert(b); } f(); </script>

      全局变量是window的属性

      执行上下文分为进入执行上下文执行代码两部分。变量声明和函数声明在进入执行上下文阶段就已完成。

      要注意的一点是 ①和②答案的不同原因在于 a 声明的是全局变量 而b因为是在函数中,所以是局部变量。

    6.

    var a = 1;
    alert(b);
    var b = function a(x) { x && a(--x); } alert(a); ①这里的Function b 不是函数声明 而是函数表达式。所以只能在执行到代码的时候才会赋值。 ②Function b 中的 a 只是匿名函数的别名,而且是个只能在 Function b里使用的局部变量。 也就是说跟变量a没有关系,不会发生覆盖。

     7.

    var a = 1;
    function a() { }
    function b() { }
    var b;
    console.log(a);
    console.log(b);
    
    //这里考察的是变量声明,变量赋值,函数声明的顺序:
    //进入执行上下文后先进行函数声明,然后是变量声明,最后进行变量赋值。并且如果函数或变量已经存在,将不会重新声明。
    //也就是说,即使把变量声明并赋值写到函数声明前面,也还是会按照上面的顺序进行。
    上面的代码等同于
    function a() { }
    function b() { }
    var a, b;
    a = 1;

    8.

    function A() {
        function m(){
            console.log(this);
        }
        this.test = function() {
            m.call(this);
            m.call(null);
        };
    }
    (new A()).test();
    
    //this值的定义:当一个方法在对象上调用的时候,this就指向到了该对象上
    //m.call(this)的结果肯定是没问题的
    //当call和apply的第一个参数是null或undefined时,参数将替换成window对象

    9.
      找出某数字数组中的最大元素(使用Math.max函数)

    var arr = [3,5,2,7,10,8];
    ①Math.max.apply([],arr);
    ②eval("(Math.max("+arr+"))");
    这是目前看到的最好最简洁两种方案了,活用apply和eval
    题外话:大家初学的时候都被告诫要“远离”eval,实际上,如果合理使用的话,eval绝对是把利器。

    10.
      转化一个数字数组为function数组(每个function都弹出相应的数字)

    var a = [2,4,6,3];
    var b =a.map(function(i,o){
        return function(){return console.log(i);};
    });

    11.
      给object数组进行排序(排序条件是每个元素对象的属性个数)

    var arr = [
        {A:32,B:2,C:5},
        {A:32},
        {A:32,B:2,C:5,D:7},
        {A:32,B:2,C:5}
    ];
    arr.sort(function(m,n){
        function getPropCount(obj){
            var i=0;
            if(typeof obj == "object"){
                for(var p in obj){
                    ++i;
                }
            }
            return i;
        }
        return getPropCount(m) - getPropCount(n);
    });

    12.
      实现如下语法的功能:var a = (5).plus(3).minus(6); //5+3-6

    Number.prototype.plus = function(num) {
        return this + num;
    };
    Number.prototype.minus = function(num) {
        return this - num;
    };
    console.log((5).plus(3).minus(6));
    
    这里 (5).plus(3).minus(6) 可以用 5..plus(3).minus(6)代替
    但不可以用 5.plus(3).minus(6) 
    数字后面的第一个小数点是属于数字部分的,相当于 5.0.plus(3),第二个才是调用方法。
    所以 5.plus()是会出错 而 5..plus()却可以

    13.
      实现如下语法的功能:var a = add(2)(3)(4)(111).....; //2+3+4+111+... 可无限扩展的。

    function add(x) {
        function fn(m) {
            fn.pValue = m + (fn.pValue || 0);
            return fn;
        };
        fn.pValue = x;
        fn.toString = fn.valueOf = function() {
            return fn.pValue;
        }
        return fn;
    }
    这里主要考察的是toString的重载。例如下面的例子
    var arr = [1,3,5]
    console.log(arr+""); // "1,3,5"
    Array.prototype.toString=function(){
        return this.join("--");
    }
    console.log(arr+""); // "1--3--5"

    :以上第五到第十四题的出处 http://dmitry.baranovskiy.com/post/91403200

      没有标准答案。 我在这里给出的答案也只是自己觉得不错的答案而已。


    14.

    考点:with对作用域的影响

    var x = 1;
    (function() {
        var x = 2;
    
        function funcA() {
            console.log(this.x);
        }
    
        with ({
            funcB: function() { console.log(this.x); }
            , x: 3
        }) {
            function funcC() {
                console.log(this.x);
            }
    
            funcA();//?
            funcB();//?
            funcC();//?
        };
    } ())

    15
    考点:setTimeout的执行时机

    var A = true;
    setTimeout(function(){
        A = false;
    },1000);
    
    while(A){}
    
    alert("End");
    //问:大约过多久会alert?

    如果不清楚setTimeout中function的触发时机的话,这绝对是个大坑


    接下来的若干题目整理自http://perfectionkills.com/javascript-quiz/


    16.

    (function(){
        return typeof arguments;
      })();
    
     1.“object2.“array”
     3.“arguments”
     4.“undefined”

    考点:arguments是类似于数组的对象,访问方式与数组相同

    17.

    var f = function g(){ return 23; };
      typeof g();
    
     “number”
     “undefined”
     “function”
      Error

    g是f方法的别用,且只能在f方法的内部使用

    18.

    (function(x){
        delete x;
        return x;
      })(3);
    
     3
    null undefined Error

    delete 只用于删除某个对象的属性,如果没有指定对象的话,则默认是window
    而这里面的形参x显然不是属性

    19.

    var y = 1, x = y = typeof x;
    console.log(x);
    
     1
     “number”
     undefined
     “undefined”

    考点:变量声明与赋值的时机

    20.

     (function f(f){
        return typeof f();
      })(function(){ return 1; });
    
     “number”
     “undefined”
     “function”
     Error

    21.

    var foo = {
        bar: function() { return this.baz; },
        baz: 1
    };
    (function(){
        return typeof arguments[0]();
    })(foo.bar);
    
     “undefined”
     “object”
     “number”
     “function

    22.

    var foo = {
        bar: function(){ return this.baz; },
        baz: 1
      }
    typeof (f = foo.bar)();
    
     “undefined”
     “object”
     “number”
     “function

    23.

    var f = (function f(){ return "1"; }, function g(){ return 2; })();
    typeof f;
    “string” “number” “
    function” “undefined”

    24.

    var x = 1;
    if (function f(){}) {
        x += typeof f;
    }
    x;
    1 “1function” “1undefined” NaN

    这个答案在浏览器间存在差异

    25.

    var x = [typeof x, typeof y][1];
    typeof typeof x;
    
     “number”
     “string”
     “undefined”
     “object”

    26.

    (function(foo){
        return typeof foo.bar;
      })({ foo: { bar: 1 } });
    
     “undefined”
     “object”
     “number”
     Error

    这个问题是考眼力的。。。
    匿名函数的实参相当于 var arg = {foo:{bar:1}};
    所以在函数执行的时候 相当于
    var arg = {foo:{bar:1}};
    return arg.bar;

    27.

     (function f(){
        function f(){ return 1; }
        return f();
        function f(){ return 2; }
    })();
    
     1
     2
     Error (e.g. “Too much recursion”)
     undefined

    考点:函数的声明与赋值时机

    28.

    function f(){ return f; }
    new f() instanceof f;
    
     true
     false

    相当于 f instanceof f;

    29.

    with (function(x, undefined){}) length;
    
     1
     2
     undefined
     Error

    乍看好像有点蒙 分解一下就好了

    var f = function(x,undefined){};
    with(f){ length;
    } //这句再恢复一下就是 with(f){ return f.length;}

    30.

    console.log(Function instanceof Object);
    var arr = [];
    console.log(arr.constructor === Array.prototype.constructor);
    
    var num = new Number(2);
    console.log(typeof num);

    31.

    (function(){
        var a=b=1;
    })();
    console.log(a);
    console.log(b);

     a和b分别会输出什么呢?

    这个问题的陷阱就是,在立即执行函数表达式(IIFE)中,有两个命名,但是其中变量是通过关键词var来声明的。这就意味着a是这个函数的局部变量。与此相反,b是在全局作用域下的。

    这个问题另一个陷阱就是,在函数中他没有使用"严格模式" ('use strict';)。如果 严格模式 开启,那么代码就会报出未捕获引用错误(Uncaught ReferenceError):b没有定义。

    记住,严格模式要求你在需要使用全局变量时,明确地引用该变量。因此,你需要像下面这么写:

    (function(){
       'use strict';
       var a = window.b=1;
    })();



  • 相关阅读:
    nginx配置ssl双向验证 nginx https ssl证书配置
    查看nginx cache命中率
    nginx 直接在配置文章中设置日志分割
    tomcat配置文件server.xml详解
    nagios服务端安装
    nagios客户端安装
    nagios原理及配置详解
    Nagios 监控系统架设全攻略
    nginx日志配置
    为MySQL选择合适的备份方式
  • 原文地址:https://www.cnblogs.com/TiestoRay/p/js_interview_questions.html
Copyright © 2011-2022 走看看