1

---- 有人会说js很简单,很容易学,但是要想把这门语言用活,用精通还是需要下很大的功夫的。那么我们就来看看接下来这几道js面试题吧。

题1

if(!(a in window)){
   var a  = 1;    
}
console.log(a);

在控制台输出的结果是 undefined,其实就是考察js中变量提升的知识点。

变量提升表示的是变量的声明会被提前到函数顶部的地方,而赋值语句不会提升。因此上面的题目实际是等于如下代码    

//变量提升

var a;
if(!(a in window)){
     a = 1;      
}
console.log(a) 

 
变量a提升到顶部,第一句就相当于window.a = undefined,所以在if语句中,判断条件始终是false,因此a=1不会执行,最终输出undefined。

题2

var a = 1,
        b = function(){
            x && a(--x);
        }    
console.log(a);

结果是1.

这道题考察的知识点是是具名函数表达式,声名函数表达式是不攒在变量提升的,所以函数的定义不会被提前到顶部;而且声名函数表达式的名字在外部访问时会报错,只能函数内部访问到。我们可以看看下面的例子。

var b = function a () {}
b(); //调用正常
a();//typeError:a is not a function

题3

function a(x){
    return x*2;
}
var a ;
console.log(typeof a);

结果为 function

这道题目是的知识点是 函数声明和变量声明。 需要记住一点就是,在JavaScript中,函数声明的优先级高于变量声明的优先级。

因此在上述题中,由于优先级的问题,a会被定义为一个函数,后面定义的变量不会生效,因此typeof的时候会返回function。

但是,需要注意的是,虽然函数声明会覆盖变量声明,但不会覆盖变量的赋值,我们将上面的代码该下,就会发现这个特点。

function a(x){
  return x*2;
}
var a = 1;
console.log(typeof a);

上面的代码会返回number。因为赋值语句a= 1不会被覆盖,所以a会是一个数字,而不是函数,最终返回number。

题4

function b(x,y,a){
    arguments[2] = 10;
    console.log(a);  
}
b(1,2,3);

最终输出的结果是10

但是,需要注意一种特殊情况,那就是严格模式,在严格模式下,arguments对象实际是函数参数的一个拷贝,实际指向的是不同的内存空间,对arguments值的改变并不会影响到函数参数值。

所以在严格模式下输出的是3

function a(){
   console.log(this);
}
a.call(null);

输出的结果是window对象。

这道题目考察的call方法,在js中,如果给call方法传递的第一个参数为null或者undefined,那么call方法中this会指向全局对象。

在浏览器环境中,全局对象为window;而在nodejs环境中全局对象为global,因此上述代码如果在浏览器下运行,会返回window。


brian
16 声望1 粉丝