在很多大厂的规范里面,有这么一条规定:不让直接使用undefined
关键字,而应该使用void 0
来替代undefined
。
一、void 0是什么意思?
void
是一个关键字,他后面跟的是一个表达式,不管这个表达式算的是啥,后面随便写个东西,最终整个表达式返回一个undefined
;比如void 123456;
最终结果返回的都是undefined
;在void
后面随便写个0 1 2
啥的都无所谓,只是习惯统一写个0;让这个东西来替代书写undefined
。
二、为什么要这么写?
其实之所以有这个规定,是因为这个undefined
本身就是一个bug
。为什么呢?见下图
定义变量的时候变量名不能为true
、null
等,但是可以定义为undefined
;
这是为啥?是因为undefined
他在一个环境里边压根就不是一个关键字,他是全局对象window
里边的一个只读属性
从图中可以看到undnfined
确实在全局对象window
中。这是一些历史问题,但是现在解决不了了。
三、那么他不是一个关键字会造成一个什么影响呢?
var undefined = 10;
// undefined
console.log(undefined); // undefined
比如定义一个变量undefined
的值为10
,然后去读这个undefined
,最后结果还是undefined
;这是因为这个undefined
,它虽然说是window
的一个属性,但是这个属性是只读的,无法更改,更改为别的值他的属性值还是undefined
。
四、这个看似没问题,为什么不让用呢?
上面这个是全局环境,那要是不在全局环境呢,比如在一个函数里面
function fn() {
var undefined = 10;
// 10
console.log(undefined);
}
fn();
上面代码可以看到在函数里边定一个一个变量undefined
的值为10
;来打印一下这个undefined
,这里输出结果为10
,是因为这里使用不到全局的undefined
了,用到的是局部的undefined
了。
这一点就会给程序埋下隐患,中小型企业不在乎无所谓,那谁会写这种代码呢,但是在大企业里边哪怕一些几率很低的事件,但他一旦发生了造成的损失是难以估量的,所以像这些隐患他能够规避就尽量规避,那怎么来规避呢,就是那条规则,当你要得到一个undefined
值的时候应该使用的是void 0
,而不是undefined
本身。
function fn() {
var undefined = 10;
// undefined
console.log(void 0);
}
fn();
这样就不会有问题了,哪怕定义的变量名字就为undefined
,也不会实际的影响要使用undefined
的地方,比如要返回一个undefined
就写return void 0
;