void与undefined之争

内容分享1个月前发布
0 0 0

今天在项目中突然遇到,参数定义为void类型,不传值,ts出现报错提示,之前还真没注意过void这玩意,然后就查阅了一下资料,简单记录一下,方便后来查阅:

众所周知,undefined是JS语言中的7大基本类型之一,表明未定义,它的值只有一个,就是undefined。任何变量在赋值前都是undefined。

undefined是可变的?

在ES5的全局环境中,undefined是只读的。而在局部作用域中,undefined是可变的。这个是JS语言公认的设计失误之一。

什么是void?

void是一元运算符,出目前操作数的左边,操作数可以是任意类型的值,void右边的表达式可以是带括号形式(例如:void(0)),也可以是不带括号的形式(例如:void 0)。

我们常常会使用到 javascript:void(0) 这样的代码, void 是 JavaScript 中超级重大的关键字,该操作符指定要计算一个表达式但是不返回值。

使用void 0取代undefined的缘由是?

而在一些框架源码中,会出现一些这样的表达式:

if (context === void 0) return func;
function foo() { 
    var a = arguments[0] !== (void 0 ) ? arguments[0] : 2; 
    return a; 
}
if (array == null) return void 0;

使用void 0比使用undefined能够减少3个字节

>"undefined".length
9
>"void 0".length
6

void 运算符能对给定的表达式进行求值,而后返回 undefined。也就是说,void 后面你随意跟上一个表达式,返回的都是 undefined,如 void (2), void (‘hello’)。而且void是不能被重写的。但为何是void 0 呢,void 0 是表达式中最短的。用 void 0 取代 undefined 能节省字节。许多 JavaScript 压缩工具在压缩过程当中,正是将 undefined 用 void 0 取代掉了。

上代码

let vd : void = 1    // 报错
let vd2 : void =  我是字符串  // 报错
let vd3 : void = true // 报错
let vd5 : void = null // 报错
let vd4 : void = undefined // 正确

这样就能直观的看出来,后来我们在遇到定义为void类型的时候,直接上undefined即可。
© 版权声明

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
none
暂无评论...