1. 程式人生 > >JS面試題集錦及解析(個人向)

JS面試題集錦及解析(個人向)

1 、

var a=10;
function test(){
    a=100;
    console.log(a);
    console.log(this.a);
    var a;
    console.log(a);
}
test();

//輸出: 100 10 100

這道題目是考察對變數宣告提升的理解 和 this關鍵字的指向性問題。

首先是變數提升,在JS中,使用var宣告的變數會被提升到當前詞法作用域的頂部,函式在編譯時變成了這樣

var a=10;
function test(){
    var a;
    a=100;
    console.log(a);
    console.log(this.a);
    console.log(a);
}
test();

這樣子就清晰了,第一次列印時,函式內部聲明瞭一個a,是100,第二次log時,因為函式是直接呼叫的,window.test()誰呼叫this就指向誰,所以是window.a結果是10.

2、下題輸出什麼?

(function(){
  var a = b = 3;
})();

console.log(a) //報錯a is not defined
console.log(b) //輸出3

這裡面的宣告語句很容易被誤解為是 var a = 3,var b = 3.實際上並不是這樣,而是這樣。

b = 3;
var a = b;

a 在區域性作用域裡用var 關鍵字宣告,所以是一個區域性變數,在函式外面接受不到,所以會報錯。

而 b 是沒有var宣告,就是this下的一個屬性. this.b .所以在外面能訪問到

3、

'a' + + 'b' // -> "aNaN"
// 因為 + 'b' -> NaN
// 你也許在一些程式碼中看到過 + '1' -> 1

4、[] == ![]

[] == ![] // -> true

//下面是分析
// [] 轉成 true,然後取反變成 false
[] == false
// 將Boolen值轉換為數字
[] == 0
// 將物件轉化為字串
// [].toString() -> ''
'' == 0
// 將字串轉化為數字
0 == 0 // -> true

在JS中 == 是會進行隱式轉換的

執行型別轉換的規則如下:
如果一個運算數是 Boolean 值,在檢查相等性之前,把它轉換成數字值。false 轉換成 0,true 為 1。
如果一個運算數是字串,另一個是數字,在檢查相等性之前,要嘗試把字串轉換成數字。
如果一個運算數是物件,另一個是字串,在檢查相等性之前,要嘗試把物件轉換成字串。
如果一個運算數是物件,另一個是數字,在檢查相等性之前,要嘗試把物件轉換成數字。
在比較時,該運算子還遵守下列規則:
值 null 和 undefined 相等。
在檢查相等性時,不能把 null 和 undefined 轉換成其他值。
如果某個運算數是 NaN,等號將返回 false,非等號將返回 true。
如果兩個運算數都是物件,那麼比較的是它們的引用值。如果兩個運算數指向同一物件,那麼等號返回 true,否則兩個運算數不等。
5、你知道哪些CSS偽類?

:link, :hover,:enabled,:disabled,:checked,:not(selector) 

這題要注意的其實是偽類和偽元素(::after)的區別

6、下面輸出什麼

function a () {
    return 
    {
        a: 'hello'
    }
}
// 輸出: undefined

為什麼輸出undefined

因為return後面的換行會被規則轉為分號