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

我们平时用到的undefined只是window对象下的一个属性。

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

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

属性
value undefined
writable false
enumerable false
configurable false

value不能修改,不能遍历,并且也不能修改(不能用Object.defineProperty来修改writableenumerableconfigurable的值)。

但是我们是可以在或者undefined的值进行的,比如:

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
}

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

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

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

而不要去使用:

var obj;
obj === undefined;

使用void也是可以的,因为void无论如何都会返回undefined

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

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

posted @   _Fatman  阅读(487)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
主题色彩