乐趣区

关于前端:源码学习之void-0

明天看源码的时候看到 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」
退出移动版