1. 即是一个数据原始类型, 也是一个原始值数据
    2. 全局对象上的一个属性

    window.undefined

    1. console.log(window.undefined) // undefined
    2. window.undefined = 1;
    3. console.log(window.undefined) // undefined
    4. // 不可写 writable: false
    5. delete window.undefined;
    6. console.log(window.undefined) // undefined
    7. // 不可配置 configurable: false
    8. for(var k in window){
    9. // 不会执行 不可枚举 enumerable: false
    10. if(k === undefined){
    11. console.log(k);
    12. }
    13. }
    14. Object.defineProperty(window, 'undefined', { // 报错 Cannot redefine property: undefined
    15. // 不可重新定义
    16. enumerable: true,
    17. writable: true,
    18. configurable: true
    19. })
    1. 系统会给一个末赋值的变量自动赋值为 undefined,类型也是 undefined

      var a;
      console.log(a); // undefined
      console.log(typeof a); // undefined
      
    2. 实参未传入相应的值时,对应形参是 undefined ```javascript function test(a){ console.log(typeof a); // undefined return a; }

    console.log(test()); // undefined;

    
    5. 函数内部没有显式返回一个值的时候,系统默认给函数返回 undefined
    ```javascript
    function test(){
        console.log(123);
    }
    
    console.log(test()); // undefined
    
    1. 全局作用域中无法把 undefined 当成一个变量使用,相当于第 2 点的 writable: false

      var undefined = 1;
      console.log(undefined); // undefined
      console.log(window.undefined); // undefined
      
      • 但局部作用域可以(包括在严格模式下),说明 undefined 不是 JS 的保留字和关键字 ```javascript function test(){ ‘use strict’; // undefined 不是 JS 的保留字和关键字 var undefined = 1; console.log(undefined); // 1 }

    test();

    
    7. undefined 相关判断
    ```javascript
    var a;
    if(a === undefined){
      console.log(true);
    }else{
        console.log(false);
    }
    // true
    
    var a == null;
    if(a == undefined){
      console.log(true);
    }else{
        console.log(false);
    }
    // true
    
    var a == null;
    if(a === undefined){
      console.log(true);
    }else{
        console.log(false);
    }
    // false
    
    var a;
    if(type a === 'undefined')
      console.log(true);
    }else{
      console.log(false);
    }
    // true
    
    console.log(typeof b); // undefined 未定义时, typeof 一概为 undefined
    
    // 判断是为声明了变量
    var a;
    if('a' in window){
        console.log(true);
    }else{
        console.log(false);
    }
    // true
    
    1. void(n) 表示 对 n (一定要有值) 进行求值,void() 始终返回 undefined
      • 使用 void(0) / window.undefined 可以在局部作用域中拿到真正 undefined 值,以防止使用 undefined 作为变量名
      • void 主要出现在以前不规范的编写中,使用 undefined 作变量名,现在出现很少,可能出现在一些底层封装中。 ```javascript console.log(void(0) === undefined); // true

    function test(){ var undefined = 1;

    console.log(undefined); // 1 console.log(void(0), window.undefined); // undefined console.log(undefined === void(0)); // false }

    test();

    ```javascript
    var a, b, c;
    a = void(b = 1, c = 2);
    console.log(a, b, c); // undefined 1 2
    

    阻止不跳转的伪协议

    <a href="javascript: void(0);"></a>
    <a href="javascript:;"></a>