全局属性undefined表示原始值`undefined。`它是一个JavaScript的 原始数据类型 。

`undefined` 属性的属性特性：
writable | false
enumerable | false
configurable | false

## 语法

    undefined

## 描述

`undefined`是全局对象的一个属性。也就是说，它是全局作用域的一个变量。`undefined`的最初值就是原始数据类型`undefined`。

在现代浏览器（JavaScript 1.8.5/Firefox 4+），自ECMAscript5标准以来undefined是一个不能被配置（non-configurable），不能被重写（non-writable）的属性。即便事实并非如此，也要避免去重写它。

一个没有被赋值的变量的类型是undefined。如果方法或者是语句中操作的变量没有被赋值，则会返回undefined（对于这句话持疑惑态度，请查看英文原文来理解）。

    function test(a){
        console.log(typeof a);    // undefined
        return a;
    }

    test();                       // 返回"undefined"

一个函数如果没有使用return语句指定`返回`值，就会返回一个undefined值。

但是它有可能在非全局作用域中被当作标识符（变量名）来使用(因为undefined不是一个`保留字`))，这样做是一个非常坏的主意，因为这样会使你的代码难以去维护和排错。

    // 不要这样做！

    // 打印 'foo string' PS：说明undefined的值和类型都已经改变
    (function() {
    var undefined = 'foo';
    console.log(undefined, typeof undefined)
    })()

    // 打印 'foo string' PS：说明undefined的值和类型都已经改变
    (function(undefined) {
    console.log(undefined, typeof undefined)
    })('foo')

## 示例

### 严格相等和undefined

你可以使用undefined和严格相等或不相等操作符来决定一个变量是否拥有值。在下面的代码中，变量x是未定义的，if 语句的求值结果将是true

    var x;

    if (x === undefined) {
    // 执行这些语句
    } else {
    // 这些语句不会被执行
    }

注意：这里是必须使用严格相等操作符（===）而不是标准相等操作符（==），因为 x == undefined 会检查x是不是null，但是严格相等不会检查。null不等同于undefined。移步`比较操作符`查看详情。

### Typeof 操作符和undefined

或者，可以使用`typeof`：

    var x;
    if(typeof x === 'undefined') {
        // 执行这些语句
    }

使用 `typeof`的原因是它不会在一个变量没有被声明的时候抛出一个错误。

    // 这里没有声明y
    if(typeof y === 'undefined') {       // 没有错误，执行结果为true
       console.log("y is " + typeof y )  // y is undefined
    }

    if(y === undefined) {                // ReferenceError: y is not defined

    }

但是，技术方面看来这样的使用方法应该被避免。JavaScript是一个静态作用域语言，所以，一个变量是否被声明可以通过看它是否在一个封闭的上下文中被声明。唯一的例外是全局作用域，但是全局作用域是被绑定在全局对象上的，所以要检查一个变量是否在全局上下文中存在可以通过检查全局对象上是否存在这个属性（比如使用`in`操作符）。

### Void操作符和undefined

`void` 操作符是第三种可以替代的方法。

    var x;
    if(x === void 0) {
        // 执行这些语句
    }

    // 没有声明y
    if(y === void 0) {
        // 抛出一个RenferenceError错误(与`typeof`相比)
    }

## 规范

Specification | Status | Comment
--- | --- | ---
ECMAScript 1st Edition (ECMA-262) undefined | Standard | Initial definition. Implemented in JavaScript 1.3.
ECMAScript 5.1 (ECMA-262) undefined | Standard |
ECMAScript 2015 (6th Edition, ECMA-262) undefined | Standard |
ECMAScript Latest Draft (ECMA-262) undefined | Draft |

## 浏览器兼容性

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!

- Desktop
- Mobile

Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari
--- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)

Feature | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile
--- | --- | --- | --- | --- | --- | ---
Basic support | (Yes) | (Yes) | (Yes) | (Yes) | (Yes) | (Yes)