[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 。