Skip to content
导航

void

之前在看vue3源码过程中,碰到某些分支判断undefined时,会使用key !== void 0的方式进行判断,而不是key !== undefined。那么为什么使用void 0,而不是undefined呢?在回答这个问题前,我们先看下undefinedvoid

undefined

MDN:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined

undefinedJavaScript的基本数据类型之一。它是全局对象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,然后+1undefined+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的优势:

  1. 不必担心undefined被修改。
  2. 字符更短,节省字节。
  3. 一些压缩工具会将undefined转为void 0,使用void 0会加快压缩速度。
void has loaded