---- 有人会说js很简单,很容易学,可是要想把这门语言用活,用精通仍是须要下很大的功夫的。那么咱们就来看看接下来这几道js面试题吧。node
题1面试
if(!(a in window)){ var a = 1; } console.log(a);
在控制台输出的结果是 undefined,其实就是考察js中变量提高的知识点。浏览器
变量提高表示的是变量的声明会被提早到函数顶部的地方,而赋值语句不会提高。所以上面的题目实际是等于以下代码 函数
//变量提高this
var a; if(!(a in window)){ a = 1; } console.log(a)
变量a提高到顶部,第一句就至关于window.a = undefined,因此在if语句中,判断条件始终是false,所以a=1不会执行,最终输出undefined。code
题2对象
var a = 1, b = function(){ x && a(--x); } console.log(a);
结果是1.ip
这道题考察的知识点是是具名函数表达式,声名函数表达式是不攒在变量提高的,因此函数的定义不会被提早到顶部;并且声名函数表达式的名字在外部访问时会报错,只能函数内部访问到。咱们能够看看下面的例子。内存
var b = function a () {} b(); //调用正常 a();//typeError:a is not a function
题3io
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。