明天看源码的时候看到 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)。undefined
在ES5
中曾经是全局对象的一个只读(read-only)属性了,它不能被重写;然而在部分作用域中,还是能够被重写的。
除了 void 0
,也能够用void 123
、void "abc"
等其余 void 表达式代替,之所以抉择 void 0
,是因为它是各种 void 表达式中字节数起码之一(6 个字节,用void 0
代替 undefined
能节俭 3 个字节)。
参考资料:
- 为什么用「void 0」代替「undefined」