JavaScript:警告空类型,null,undefined和NaN

时间:2018-02-11 11:56:47

标签: javascript

我想创建一个函数warn,它可以作为一个简单的一般错误处理函数,它可以执行以下操作:

  • 测试条件的变量(通常为NaNnullundefined,但可以是[]''等)
  • 如果条件为真,则输出警告(并且详细信息已打开)
  • 如果条件为真(并且致命打开),则结束该功能

目前,这就是我所拥有的:

function warn(thing, thingString, shouldNotBe, fatal, verbose){
    // default verbose
    if (verbose == undefined) {verbose = true;}
    // default fatal
    if (verbose == undefined) {verbose = false;}

    if (
      thing == shouldNotBe || // test for undefined and null
      (isNaN(shouldNotBe) && shouldNotBe != undefined && isNaN(thing)) // test for NaN
    ) {
      message = thingString + ' is ' + shouldNotBe

      if (fatal) { message = '[FATAL]: ' + message}

      if ( verbose ) { console.warn( message ) }

      if ( fatal ) { return true }
      else { return false }
    }
  }

这让我可以在我的代码中执行以下操作:

var myVar
fatal = warn(myVar, 'myVar', undefined, true)
if ( fatal ) {return}

> [Fatal]: myVar is undefined

我面临的问题是JS的NaN:

NaN === NaN ---> (false)
NaN == NaN ---> (false)
isNaN(NaN)  ---> (true)
isNaN(undefined) ---> (true)
isNaN(null) ---> (false)

所以我必须有这个丑陋的条件(我可以缩短):

(isNaN(shouldNotBe) && shouldNotBe != undefined && isNaN(thing))

为:

  • 首先测试变量shouldNotBe不是数字(undefinedNaN
  • 测试shouldNotBe未定义
  • 测试thing也是NaN

所以我的问题是有更好的方法来解决这个问题吗? NaN 不能通过条件进行测试的事实确实会引发争议。

1 个答案:

答案 0 :(得分:1)

您可以将部分isNaN(shouldNotBe) && shouldNotBe != undefined缩短为Number.isNaN(shouldNotBe)。您也可以使用Object.is代替==,但是您需要null == undefined+0 == -0的特殊情况。