[TOC] # **Undefined:未定义类型** &emsp;&emsp;Undefined 是 Javascript 中特殊的原始数据类型,它只有一个值,即 undefined,字面意思是:未定义的值 。它的语义是,希望**表示一个变量最原始的状态,而非人为操作的结果 。** 这种原始状态会在以下 4 种场景中出现: <br> ## 【1】**声明了一个变量,但没有赋值** ``` var foo; console.log(foo);//undefined ``` &emsp;&emsp;访问 foo,返回了 undefined,表示这个变量自从声明了以后,就从来没有使用过,也没有定义过任何有效的值,即处于一种原始而不可用的状态。 <br> ## 【2】**访问对象上不存在的属性** ``` console.log(Object.foo);// undefined var arr = []; console.log(arr[0]);// undefined ``` &emsp;&emsp;访问 Object 对象上的 foo 属性,返回 undefined , 表示Object 上不存在或者没有定义名为 foo 的属性。数组中的元素在内部也属于对象属性,访问下标就等于访问这个属性,返回 undefined ,就表示数组中不存在这个元素。 <br> ## 【3】**函数定义了形参,但没有传递实参** ``` // 函数定义了形参 a function fn(a) { console.log(a);//undefined } fn();// 未传递实参 ``` &emsp;&emsp;函数 fn 定义了形参 a, 但 fn 被调用时没有传递参数,因此,fn 运行时的参数 a 就是一个原始的、未被赋值的变量。 <br> ## 【4】**使用 void 对表达式求值** ``` void 0 ;// undefined void false;// undefined void [];// undefined void null;// undefined void function fn(){} ;// undefined ``` &emsp;&emsp;ECMAScript 明确规定 void 操作符 对任何表达式求值都返回 undefined ,这和函数执行操作后没有返回值的作用是一样的,JavaScript 中的函数都有返回值,当没有 return 操作时,就默认返回一个原始的状态值,这个值就是 undefined,表明函数的返回值未被定义。 &emsp;&emsp;因此,undefined 一般都来自于某个表达式最原始的状态值,不是人为操作的结果。当然,你也可以手动给一个变量赋值 undefined,但这样做没有意义,因为一个变量不赋值就是 undefined 。