寫在開頭
這篇文章是面試系列的第一篇,寫這個系列其實不僅僅是為了找工作,也是想將JS中重要的,容易混淆的知識點研究清楚,題目來自于github上的一個開源項目。
undefined 和 undeclared 的區別:
- undefined是一個JS類型,這個類型只有一個值,即特殊的undefined值。在使用
var
聲明變量但未對其對象初始化,這個變量的值就是undefined. - undeclared可以被看作是一種語法錯誤。所以我認為可以在稱呼這兩者時加以區分:
-
值為undefined的變量
var a=undefined; var b;
-
undeclared的變量 (沒有被聲明的變量)
a; b=10;
-
例子:
"variable age is undeclared"可以被理解成兩種情況:
第一種:既沒有聲明變量也沒有賦值:
javascript alert(age); //Uncaught ReferenceError: age is not defined
-
第二種:沒有聲明變量但賦值了:隱式轉換成全局變量
```javascript
function test(){
age= 10;
var yourAge=20;
}
test();alert("age:"+age); //10 alert("your age:"+yourAge); //Uncaught ReferenceError: yourAge is not defined ```
- 第二種情況test方法里的age因為沒有聲明(undeclared),被JS引擎當做全局變量使用,所以在test方法外也能被獲取到,而yourAge在test方法里被正確聲明以及賦值,它的作用域僅限于在test方法內被使用,所以想從方法外調用時會報錯,因為無法在test()方法外找到yourAge變量,和第一種的undeclare相似。
undefined 和 null
- null類型和undefined的一樣,也是一個只有一個值的數據類型,這個特殊的值是null。
alert(undefined==null)//true
本質區別:
- null表示一個值被定義了,定義為"空值"
- undefined 表示根本不存在定義
用法區別:
-
null的用法:
- 意在保存對象的變量還沒有真正保存對象,就應該明確地讓該變量保存null值。
- 對象原型鏈的終點
- 作為函數的參數,表示該函數的參數不是對象
-
undefined的用法:
- 變量被聲明但沒有被賦值.
var a;
- 調用函數時,應該提供的參數沒有提供,該參數等于undefined.
function f(x){ alert(x); } f(); //x undefined
- 對象沒有賦值的屬性,該屬性的值為undefined.
var person=new object(); person.age //age undefined
- 函數沒有返回值時,默認返回undefined
var x=f(); x //undefined
- 變量被聲明但沒有被賦值.
如何檢測null, undefined和undeclared
```
var a=null;
var b;
alert(typeof a); //object
alert(typeof b); //undefined
alert(typeof c); //undefined
```
參考
- Javascript高級程序設計
- undefined和null的區別-阮一峰的網絡日志
- MDN