外观
void
之前在看vue3
源码过程中,碰到某些分支判断undefined
时,会使用key !== void 0
的方式进行判断,而不是key !== undefined
。那么为什么使用void 0
,而不是undefined
呢?在回答这个问题前,我们先看下undefined
与void
:
undefined
MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
undefined
是JavaScript
的基本数据类型之一。它是全局对象window
的一个属性。自ECMAscript5
标准以来undefined
是一个不能被配置,不能被重写的属性。也就是说在全局作用域无法更改undefined
。
js
undefined = 'test'
consle.log(undefined) // undefined
但在局部作用域下,undefined
是可以被修改的:
js
(function print() {
var undefined = 1
console.log(undefined, typeof undefined) // 1, 'numbder'
})()
在局部作用域中undefined
被当做成一个变量,可以对其随意修改。
如果一个函数没有返回值,那么它会返回一个undefined
。
js
function print(x) {
console.log(x)
}
const res = print(1)
console.log(res) // undefined
void
MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
语法:void expression
void
运算符后面的表达式会被执行,并且void
总是返回undefined
。
js
console.log(void '') // undefined
console.log(void 0) // undefined
console.log(void true) // undefined
console.log(void {}) // undefined
console.log(void function(){}) // undefined
void function (){
console.log('test') // 打印test
}()
void (1+1) // undefined
void 1+1 // NaN
void
运算符的优先级要高于+
,所以在void 1+1
中会先计算void 1
,返回undefined
,然后+1
,undefined+1=NaN
void
运算符的几种用法:
- 立即调用的函数表达式:
js
// 常规的IIFE
(function test() {
// ...
})()
// 使用void
void function test() {
}()
使用void
后,function
会被识别为函数表达式而不是函数声明语句
- Javascript URIs:用以下方式,将
a
标签点击无响应。
html
<a href="javascript: void(0)">
DEMO
</a>
- 在箭头函数中避免泄漏
js
button.onclick = () => void doSomething();
当doSomething
的返回值发生变化后,不会改变onclick
的行为。
综上可以看出void 0
相比较undefined
的优势:
- 不必担心
undefined
被修改。 - 字符更短,节省字节。
- 一些压缩工具会将
undefined
转为void 0
,使用void 0
会加快压缩速度。