明天看源码的时候看到 void 0 这样的写法,平时在业务代码里根本没有这样的写法,于是学习了一下。

在控制台运行了一下void 0,失去返回值是undefined

在MDN上搜了一下void,理解到:

  • void是个运算符
  • void用于获取原始数据类型undefined
  • void能够将function关键字辨认为函数表达式(立刻执行函数)
  • void能够用于箭头函数以防止透露

以vue的源码为例:

  var createEmptyVNode = function (text) {    if (text === void 0) text = '';    var node = new VNode();    node.text = text;    node.isComment = true;    return node  };

这段代码用于创立一个空节点。

这里void 0返回了undefined,并与传入的text参数比拟,如果相等,将text赋值为空字符串。

为什么这里不间接用undefined,而要“多此一举”地用void 0

看上面这段代码:

function test(){    let undefined = "666";    console.log(undefined); // "666"    console.log(void 0); // undefined}

能够看到,undefined是能够被重写的:在test函数中undefined被重写为字符串"666",而void 0却不受影响,仍然失去undefined数据类型。

这里须要留神:

  • undefined 并不是保留词(reserved word),它只是全局对象的一个属性,在低版本 IE 中能被重写(因而很多框架为了兼容低版本,就会选用void 0代替undefined)。
  • undefinedES5 中曾经是全局对象的一个只读(read-only)属性了,它不能被重写;然而在部分作用域中,还是能够被重写的。

除了void 0,也能够用void 123void "abc"等其余void表达式代替,之所以抉择void 0,是因为它是各种void表达式中字节数起码之一(6个字节,用void 0代替undefined能节俭3个字节)。


参考资料:

  • 为什么用「void 0」代替「undefined」