[TOC]
# **Undefined:未定義類型**
  Undefined 是 Javascript 中特殊的原始數據類型,它只有一個值,即 undefined,字面意思是:未定義的值 。它的語義是,希望**表示一個變量最原始的狀態,而非人為操作的結果 。**?這種原始狀態會在以下 4 種場景中出現:
<br>
## 【1】**聲明了一個變量,但沒有賦值**
```
var foo;
console.log(foo);//undefined
```
  訪問 foo,返回了 undefined,表示這個變量自從聲明了以后,就從來沒有使用過,也沒有定義過任何有效的值,即處于一種原始而不可用的狀態。
<br>
## 【2】**訪問對象上不存在的屬性**
```
console.log(Object.foo);// undefined
var arr = [];
console.log(arr[0]);// undefined
```
  訪問 Object 對象上的 foo 屬性,返回 undefined , 表示Object 上不存在或者沒有定義名為 foo 的屬性。數組中的元素在內部也屬于對象屬性,訪問下標就等于訪問這個屬性,返回 undefined ,就表示數組中不存在這個元素。
<br>
## 【3】**函數定義了形參,但沒有傳遞實參**
```
// 函數定義了形參 a
function fn(a) {
console.log(a);//undefined
}
fn();// 未傳遞實參
```
  函數 fn 定義了形參 a, 但 fn 被調用時沒有傳遞參數,因此,fn 運行時的參數 a 就是一個原始的、未被賦值的變量。
<br>
## 【4】**使用 void 對表達式求值**
```
void 0 ;// undefined
void false;// undefined
void [];// undefined
void null;// undefined
void function fn(){} ;// undefined
```
  ECMAScript 明確規定 void 操作符 對任何表達式求值都返回 undefined ,這和函數執行操作后沒有返回值的作用是一樣的,JavaScript 中的函數都有返回值,當沒有 return 操作時,就默認返回一個原始的狀態值,這個值就是 undefined,表明函數的返回值未被定義。
  因此,undefined 一般都來自于某個表達式最原始的狀態值,不是人為操作的結果。當然,你也可以手動給一個變量賦值 undefined,但這樣做沒有意義,因為一個變量不賦值就是 undefined 。