在很多大厂的规范里面,有个非常奇葩的规定,不能直接使用undefined
关键字,而应该使用void 0
来替换undefined
关键字;
void 0
是什么意思?
void
是一个关键字,void
后面可以跟一个表达式,不管void
后面的表达式运算结果是多少(任意的一个表达式),最终整个表达式返回一个undefined
的结果,所以void
后面写 0
, 1
, 2
等等都可以,为了统一编程习惯,所以一般后面写0
。
输入
void 123213213213
输出
undefined
为什么要void 0
替代书写undefined
之所以有这么奇葩的规定,是因为undefined
本身就很奇葩,比如:
- 定义变量
null
> v a r \color{DarkOrchid}{var} var n u l l \color{DarkOrchid}{null} null
<Uncaught SyntaxError: Unexpected token 'null'
- 定义变量
true
> v a r \color{DarkOrchid}{var} var t r u e \color{MidnightBlue}{true} true
<Uncaught SyntaxError: Unexpected token 'true'
- 定义变量undefined
> v a r \color{DarkOrchid}{var} var u n d e f i n e d \color{MidnightBlue}{undefined} undefined
< u n d e f i n e d \color{Gray}{undefined} undefined
为什么可以定义undefined
为变量名称,从本质来说在特定的环境里面undefined
不是一个关键字,它是全局对象window
里面的一个属性
- 全局环境中undefined是window的属性,且为只读不能赋值,
- 函数(局部)环境中undefined可以被定义为变量
- 读取
window.undefined
变量的值
> w i n d o w . u n d e f i n e d \color{Black}{window.undefined} window.undefined
< u n d e f i n e d \color{Gray}{undefined} undefined
- 询问
undefined
属性在不在window中,返回的是true
> " u n d e f i n e d " \color{Brown}{"undefined"} "undefined" i n \color{DarkOrchid}{in} in w i n d o w \color{Black}{window} window
< t r u e \color{MidnightBlue}{true} true
会造成什么样的影响?
由于它不是关键字,我可以定义一个变量,名字叫undefined
,并且给他重新赋值,是不是意味着这个值不再是undefined
?
- 定义变量
undefined
并赋值10
> v a r \color{DarkOrchid}{var} var u n d e f i n e d = 10 ; \color{MidnightBlue}{undefined=10;} undefined=10;
< u n d e f i n e d \color{Gray}{undefined} undefined
再次读取变量的值,结果还是undefined
,这是因为虽然它是window
的一个属性,但是这个属性是只读的
- 读取undefined变量的值
> u n d e f i n e d \color{Black}{undefined} undefined
< u n d e f i n e d \color{Gray}{undefined} undefined
- 给
window.undefined
赋值1234
> w i n d o w . u n d e f i n e d = \color{Black}{window.undefined=} window.undefined= 1234 \color{MidnightBlue}{1234} 1234
< 1234 \color{MidnightBlue}{1234} 1234
- 再次读取
window.undefined
变量的值
> w i n d o w . u n d e f i n e d \color{Black}{window.undefined} window.undefined
< u n d e f i n e d \color{Gray}{undefined} undefined
在一个函数的环境里面,定义一个变量名字叫undefined
,然后打印一下undefined
,打印的时候使用的是局部变量的undefined
,它的值为10
。
代码
function m(){var undefined=10;console.log(undefined);
}
m()
运行结果
10
这种情况下就会给我们的程序埋下隐患,中小型企业可能不在乎,觉得无所谓,一般没人会写这样的代码,但是大企业里面,即便是概率很低的事件,一旦发生造成了损失将是不可估量的,所以这些隐患,能够规避的尽量规避。怎么规避呢?有这么一条规则,当你要得到一个undefined
值的时候,应该使用void 0
,而不是undefined
本身,这么一来就没问题了。
代码
function m(){var undefined=10;console.log(void 0);
}
m()
运行结果
undefined
哪怕你定义的变量名字就是undefined
,也不会实际的影响到我要使用undefined
的地方,比如我要返回一个undefined
看他返回的是什么?
代码
function m(){var undefined=10;return void 0;
}
console.log(m());
运行结果
undefined