JavaScript 觀念測試 | 01

前言:
先前讀《超速學習》,其中有一個學習方式是直接透過考題驗證自己學習的東西是不是正確,並且要有即時的反饋才能修正錯誤。在讀了一些 JavaScript 的觀念後,也想驗證自己是否真的理解且吸收,因此在網路上找了一些考題,把比較有趣的記錄下來,並且寫下解題思路。

1. 以下程式碼片段,請問 a.length 的值是多少?

1
2
3
4
5
var a=[]; 
a[0]=1;
a[1]=2;
a[2]=3;
a[5]=4;

選項:
A. 會報錯
B. 3
C. 4
D. 6

答案: 6

解析:本來以為答案是會報錯,原來沒有賦值的元素會自動給 undefined。所以陣列 a 會是這樣:

Array[6]
0: 1
1: 2
2: 3
3:undefined
4:undefined
5: 4
length: 6

2. 請問在 JavaScript 程式中,alert(undefined==null)的輸出結果是?

選項:
A. null
B. undefiend
C. true
D. false
E. 以上答案皆不正確

答案:true

解析:
這題問法有些為不嚴謹,第一個想法是在兩個等號比較值的狀況下,會想先把 undefined 和 null 轉成數字,undefiened 是 NaN,null 則為 0,所以一開始選了 fasle。後來查了資料發現,兩個運算符比較這兩個形態會是true,undefined 和 null 如果被放在 if 當中,都會被視作為 false,是比較特殊的地方。

如果是use strict 的條件下,會是 false。

額外補充:
== 比較兩者的值,=== 較為嚴謹還需比較型態。如果是三個等號的問法,undefined 類型為 undefined,null 類型為 object。

3. 請問 a 的結果是什麼?

1
2
3
4
if(! "a" in window){
var a = 1;
}
alert(a);

選項:
A. null
B. 1
C. undefiend
D. 以上答案皆不正確

答案: C

解析:
先解讀函式,假如變數 a 沒有在 window,就不會進入到條件式中。如果有 a ,a 則等於 1。

var 宣告變數會被 hoisting,所以這段程式碼應該會是以下這樣:

1
2
3
4
5
6
var a
if(! "a" in window){
a = 1;
}
alert(a);

a 其實是全域變數,不會進入到條件式中,alert(a)但是 a 尚未被賦值,答案是 undefined。

4. 請給出這段程式碼的執行結果?

1
2
3
4
5
6
7
8
var bb = 1;
function aa(bb) {
bb = 2;
alert(bb);
};
aa(bb);
alert(bb);

選項:
A. 11
B. 12
C. 21
D. 22

答案:C

解析:
alert(bb)取全域變數 bb 的值為 1 沒有問題,比較需要思考的是 function aa 裡的 bb。bb 是參數,不是被定義為全局面量,所以並不會覆蓋到 第一行 var bb = 1。

其實是像這樣:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

var bb =1;

function aa(bb) {// 這裏隱藏了一個宣告變量, var bb;

bb = 2;// 對函式作用域進行賦值 bb = 2 ;

alert(bb);//弹出 bb 的值 2;

};

aa(bb);

alert(bb);// 根據 RHS 查找變數 bb,變數值為 1

使用函數的形參形成的私有變量,必須要把這個變量賦值給另外一個變量才可以使用,也就是獲得到形參的值。

作者

Emma Shih

發表於

2020-08-30

更新於

2021-06-23

許可協議

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

評論

You forgot to set the shortname for Disqus. Please set it in _config.yml.