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

我们平时用到的 u n d e f i n e d \color{#FF3030}{undefined} undefined只是 w i n d o w \color{#FF3030}{window} window对象下的一个属性。

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

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

属性
valueundefined
writablefalse
enumerablefalse
configurablefalse

v a l u e \color{#FF3030}{value} value不能修改,不能遍历,并且 属 性 描 述 符 \color{#FF3030}{属性描述符} 也不能修改(不能用 O b j e c t . d e f i n e P r o p e r t y \color{#FF3030}{Object.defineProperty} Object.defineProperty来修改 w r i t a b l e 、 e n u m e r a b l e 、 c o n f i g u r a b l e \color{#FF3030}{writable、enumerable、configurable} writableenumerableconfigurable的值)。

但是我们是可以在 函 数 作 用 域 \color{#FF3030}{函数作用域} 或者 块 级 作 用 域 \color{#FF3030}{块级作用域} u n d e f i n e d \color{#FF3030}{undefined} 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}{块级作用域} 中也定义了一个 u n d e f i n e d \color{#FF3030}{undefined} undefined变量,在此作用域中就会优先使用新定义的变量,而不会去使用 w i n d o w . u n d e f i n e d \color{#FF3030}{window.undefined} window.undefined,从而造成一种我们将 w i n d o w . u n d e f i n e d \color{#FF3030}{window.undefined} window.undefined的值改变了的假象。

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

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

而不要去使用:

var obj;
obj === undefined;

使用 v o i d 关 键 字 \color{#FF3030}{void关键字} void也是可以的,因为 v o i d 关 键 字 \color{#FF3030}{void关键字} void无论如何都会返回 u n d e f i n e d \color{#FF3030}{undefined} undefined

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值