当前位置 博文首页 > _Fatman:你真的知道为什么要使用void(0)代替undefined吗?

    _Fatman:你真的知道为什么要使用void(0)代替undefined吗?

    作者:_Fatman 时间:2021-02-01 16:26

    因为在函数作用域或者块级作用域中也定义了一个undefined变量,在此作用域中就会优先使用新定义的变量,而不会去使用window.undefined,从而造成一种我们将window.undefined的值改变了的假象。

    我们平时用到的\(\color{#FF3030}{undefined}\)只是\(\color{#FF3030}{window}\)对象下的一个属性。

    Object.getOwnPropertyDescriptor(window, undefined);
    //{value: undefined, writable: false, enumerable: false, configurable: false}
    

    也正是因为如此,导致它在函数作用域中是可以修改。
    但前提要加声明,因为不加声明,操作的\(\color{#FF3030}{window.undefined}\),而\(\color{#FF3030}{window.undefined}\)的属性描述符是:

    属性
    value undefined
    writable false
    enumerable false
    configurable false

    \(\color{#FF3030}{value}\)不能修改,不能遍历,并且\(\color{#FF3030}{属性描述符}\)也不能修改(不能用\(\color{#FF3030}{Object.defineProperty}\)来修改\(\color{#FF3030}{writable、enumerable、configurable}\)的值)。

    但是我们是可以在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)\(\color{#FF3030}{undefined}\)的值进行\(\color{#FF3030}{“修改”}\)的,比如:

    function fn(){
        undefined = 1111;
        console.log('undefined : ' + undefined);
    }
    fn();//undefined : undefined
    
    function fn(){
        var undefined = 1111;
        console.log('undefined : ' + undefined);
    }
    fn();//undefined : 1111
    
    {
        let undefined = 1111;
        console.log('undefined : ' + undefined);//undefined : 1111
    }
    

    这是因为在\(\color{#FF3030}{函数作用域}\)或者\(\color{#FF3030}{块级作用域}\)中也定义了一个\(\color{#FF3030}{undefined}\)变量,在此作用域中就会优先使用新定义的变量,而不会去使用\(\color{#FF3030}{window.undefined}\),从而造成一种我们将\(\color{#FF3030}{window.undefined}\)的值改变了的假象。

    所以我们在判断变量的类型时,最好使用:

    var obj;
    typeof obj ===  'undefined';
    

    而不要去使用:

    var obj;
    obj === undefined;
    

    使用\(\color{#FF3030}{void关键字}\)也是可以的,因为\(\color{#FF3030}{void关键字}\)无论如何都会返回\(\color{#FF3030}{undefined}\)

    var obj;
    obj === void(0);
    

    这也是在实际开发中经常使用\(\color{#FF3030}{void(0)}\)来代替\(\color{#FF3030}{undefined}\)的原因了。

    bk