void 0与undefined的关系

12/28/2020 JS

在练习 TypeScript 的时候,在对比.ts 文件和转换后的.js 文件的时候:

//index.ts
function getInfo(name: string, age: number = 10): void {
  console.log(name)
  console.log(age)
}

下面是转换后的文件:

// index.js
function getInfo(name, age) {
  if (age === void 0) {
    age = 10
  }
  console.log(name)
  console.log(age)
}

这里有个判断:

age === void 0

在我的印象中,这里本来应该是undefined,但是却变成了void 0.所以我们来看看这两者之间有什么联系. 为什么不直接使用 undefined 呢.这是因为 undefined 虽然在 ES5 中,是全局对象中一个只读属性(read-only),不能被重写,但是在局部作用域中,却是可以被重写的

;(function() {
  var undefined = 1 //局部变量
  console.log(undefined) //1
})()(function() {
  undefined = 1 //全局属性
  console.log(undefined) //undefined
})()

那么为什么可以用 void 0 来代替 undefined 呢: 在 MDN 中有这么一句话:戳我 (opens new window)

The void operator evaluates the given expression and then returns undefined

意思就是:void 操作符计算给定的表达式,并且返回 undefined.

所以我们可以这样理解,void 后面随便跟着什么都是返回的 undefined,又因为void 0 这个表达式最短,所以一般就用这个代替了.

    希望像星光一样闪烁
    文雀