几道有趣的面试题

1. var a;

        var b = a * 0;

        if (b == b) {

            console.log(b * 4 + '2' - 0 + 2);

        } else {

            console.log(!b * 4 + '2' - 0 + 2);// !b = 1;

        }  

         解答:   a声明为赋值,结果为undefined  b=a*0,undefined*0结果为 NaN ,NaN与NaN不相等故而执行else里的代码  b隐式转换布尔值为false ,而false转换为数字为0,故而!b=1;

所以不难得出结果为44.

        2.

        var obj = {proto : {a:1,b:2}};

        function F () {};

        F.prototype = obj.proto;

        var f = new F();

        obj.proto.c = 3;

        obj.proto = {a:-1,b:-2};

        console.log(f.a);

         console.log(f.c);

         delete F.prototype['a'];    

          console.log(f.a);

            console.log(obj.proto.a);


      解答:  F为构造函数  ,第三行代码将obj的proto属性赋给了F的原型, 而f为F的实例对象,故而f.a结果为obj里的a的值,也就是1;

而复杂数据类型直接传递的是指针,也就是说在obj的proto中加入 属性c,那么F的原型中也会有c属性,故而f.c的值为3;

        在F的原型中删除了a属性,f为F的实例对象,故而删除 之后f.a的值为undefined;

        而后obj的指针方向发生了改变,所以obj.proto.a的结果为 -1;

            3.

       

           

  • 1
  •        

  •        

  • 1
  •        

  •        

  •        

  •        

  • 1
  •    

        var lis = document.getElementsByTagName('li');

        for  (var i = 0; i < lis.length; i++) {

            if (lis[i].innerHTML == '') {

                lis[i].parentNode.removeChild(lis[i]);

            }

        }

        因为少了一个i--; 所以当i = 0的时候检查失败继续执行,i=1时检查成功删除索引为1的li结构,i从2开始查找 id为5的但是内容为空的li最后被剩下了

          4.输出结果是多少

        ( function test () {

            var  a = b = 5;

            var c = 5, d = 5; e = 5;

            console.log(a)  //自调用  函数内部都是5

            console.log(b)

            console.log(c)

            console.log(d)

            console.log(e)

        })();

            console.log(a)  //报错

            console.log(b)  //隐式全局变量  5

            console.log(c)  //函数外访问不到 所以是报错了

            console.log(d)  //函数外访问不到 所以是报错了

            console.log(e) ////隐式全局变量  5

        5. 输出 结果是什么

        var a = {

            name: '小明'

        };

        var b = a;

        a = {

            name: '小王'

        };


        console.log(a.name);   

        console.log(b.name);  

     a重定向,指针发生了改变,原来的指针复制给了b,所以a.name为小王, b.name为小明

        6.输出 结果是什么

          if (!("t" in window)) {

           var t = 1;

         }

         console.log(t);


         输出 结果是 undefined

        代码的含义是  如果window里没有t这个 属性就声明t并赋值1  但是  ==> js引擎会将var 提前 那么相当于代码变为

        var t ;

        if (! 't' in window) {

            t = 1;

        }

        console.log(t);

           声明提前之后,if 语句的判断结果为false,所以永远不会执行。故而结果为undefined

你可能感兴趣的:(几道有趣的面试题)