10道典型的javascript面试题(2)

请注意,本文编写于 171 天前,最后修改于 170 天前,其中某些信息可能已经过时。

问题5:call()和apply()



修复前一个问题,让最后一个console.log()打印输出Aurelio DeRosa.
答案
这个问题可以通过运用call()或者apply()方法强制转换上下文环境.

console.log(test.call(obj.prop));

问题6:闭包(Closures)



考虑下面的代码:

var nodes = document.getElementsByTagName('button');
for(var i = 0;i < nodes.length;i++)
{
    nodes[i].addEventListener('click',function(){
    console.log('You clicked element #'+i);
});
}

请问,如果用户点击第一个和第四个按钮的时候,控制台分别打印的结果是什么?为什么?
答案
打印两次You clicked element #nodes.length.其中nodes.length是nodes的节点个数.原因是在for循环后,变量i的值等于节点列表的长度.此外,因为i在代码添加处理程序的作用域中,该变量属于处理程序的闭包.在处理程序将被执行的时候,在控制台上将打印变量i的当前值,等于节点列表的长度.

问题7:闭包(Closures)



修复上题的问题,使得点击第一个按钮是输出0,点击第二个按钮是输出1,依此类推.
答案
有多种办法可以解决这个问题,我首先想到的就是把var改成let就行了.

还可以使用立即执行函数表达式再创建一个闭包,从而得到所期望的i的值.实现此方法的代码如下:

var nodes = document.getElementsByTagName('button');
for(var i = 0;i < nodes.length;i++){
nodes[i].addEventListener('click',(function(i){
return function(){
     console.log('You clicked element #'+i);
   }
 })(i))
}

问题8:数据类型



考虑如下代码:

console.log(typeof null);
console.log(typeof {});
console.log(typeof []);
console.log(typeof undefined);

答案
控制台将显示以下内容:

object
object
Object
undefined

问题9:事件循环



下面代码运行结果是什么?请解释.

function printing(){
      console.log(1);
      setTimeout(function(){console.log(2);},1000);
      setTimeout(function(){console.log(3);},0);
      console.log(4);
}
printing();

答案
输出结果:

1
4
3
2

输出结果为1,因为它是函数的第一句并且没有使用setTimeout()函数来延迟.接着输出4,因为他是没有被延迟的函数,也没有进行排队.然后,只剩下2,3,两者都被排队,但是前者需要等待一秒,后者等待0秒.

问题10:算法


//判断一个数是否是质数
 
    function judgeZS(num) {
        var isZS = true;
        //只能被1和自身整除的数字就是质数
        //也就是说 如果能找到除了1和自身之外的 其他的数字 如果能整除 就说明不是质数
        for (var i = 2; i < num; i++) {
            if (num % i === 0) {//说明num可以被其他的数字整除 也就说明num不是质数
                isZS = false;
            }
        }
        return isZS;
    }
 
    /*console.log(judgeZS(2));
     console.log(judgeZS(3));
     console.log(judgeZS(4));*/
 
    //console.log(judgeZS(9));//false
Comments

添加新评论