ES2015/2016'typeof varName ==='undefined`的方式?

Hed*_*dge 51 javascript ecmascript-6 ecmascript-2016

我现在正在沉溺于ES2015 +奢侈品和一些项目,我想知道我是否可以摆脱那些讨厌的拐杖undefined在新的仙境中检查.

typeof varName === 'undefined'在ES2015 +中是否有更短但仍然准确的方式?

当然我可以使用默认参数,但这也感觉就像一个不必要的任务.

function coolFn(a = null){
   if (a===null) console.log("no a supplied");
}
Run Code Online (Sandbox Code Playgroud)

Aln*_*tak 74

检查一下varName === undefined.

在较旧的浏览器中,可以为全局undefined变量分配一个备用值,导致该测试失败,但在ES2015 +中,这是不可能的.

请注意,undefined除了通过查看之外,没有办法区分显式传递作为参数而不是完全不参数arguments.length.

  • 从ES5开始,您无法改变全局`undefined`属性.但你仍然可以用局部变量来遮蔽它. (5认同)
  • ES5的@torazaburo [附件E](http://www.ecma-international.org/ecma-262/5.1/#sec-E)列出了"全局对象的值属性NaN,无穷大和未定义"已更改是只读属性"与ES3不兼容.因此,更改也会影响非严格模式. (3认同)

Ori*_*iol 22

唯一typeof varName === 'undefined'有用的情况是当您不知道变量是否varName已被声明时.

如果您不知道您的变量是否已声明,那么您的代码会出现严重问题.

在其他情况下,您有更好的选择:

  • varName === void 0

    这将检测是否varName未定义.

    void是一个接收参数的运算符(您可以使用任何代替0),并返回undefined.

  • varName === undefined

    应该检测是否varName未定义.

    但是,请注意全局undefined可能已被覆盖(在ES5之前)或被其他值遮蔽.因此我更喜欢void,也更短.

  • varName == null

    这将检测是否varName为undefined或为null.

  • !varName

    这将检测是否varName为falsy(undefined,null,0,空字符串,NaN,false).