【JavaScript】使用void 0替代undefined

在很多大厂的规范里面,有个非常奇葩的规定,不能直接使用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里面的一个属性

  1. 全局环境中undefined是window的属性,且为只读不能赋值,
  2. 函数(局部)环境中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

你可能感兴趣的:(JavaScript,javascript,开发语言,ecmascript)