---- 有人會說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。