js 如何一句话同时判断 undefined null 空 ?

  1. 现在我判断 变量是否有效是通过如下的方式(也就是 undefined null '' 各判断一次 ):
if( (this.$route.query.openid != undefined || this.$route.query.openid != null || this.$route.query.openid != '' ) && window.localStorage.getItem('openid') != '')
{
      ......
 }

想问下 JS 或者 Vue 或者 ES 中有没有什么方法能一次性直接判断变量是否有效?

阅读 19.8k
8 个回答

if(condition){} 中,有以下几种类型会被判定为假值:

  • null
  • undefined
  • 0
  • ""
  • false
  • void 0
  • NaN

所以不需要像你那样枚举:

if(this.$route.query.openid && window.localStorage.getItem('openid'))
{
      ......
 }

然后就是尽量不要用双等号,尽量用全等号

楼主采纳的 @原罪 的答案不够准确,抱着严谨负责的态度,有必要补充说明下,首先进行一个判断的时候,如果一个变量是没有声明的是不能直接判断的,比如下面的判断会报错。

// 在全局域,非方法内
if(a) {
    console.log(1)
} else {
    console.log(2)
}
// 会报错,因为a没有声明不能直接调用

这时候就要用以下判断

if(typeof a !== 'undefined' && a !== null) {
    console.log(1)
} else {
    console.log(2)
}
// 是不是要判断空值(比如false, '', NaN这些的),要看楼主的需求

但是如果一个变量已经声明过(不管变量是否被赋值过),比如在一个方法内,

function (a) {
    if(a) {
        console.log(1)
    } else {
        console.log(2)
    }
    // 或者这样判断
    if(a != null) {
        console.log(1)
    } else {
        console.log(2)
    }
}

或者这样的

var a;
if(a) {
    console.log(1)
} else {
    console.log(2)
}

这时候是没有问题的

PS:基本上不存在 a == undefined 这样的判断,如果是未声明的undefined, 这样判断会报错, 换成typeof a == 'undefined'。如果是对象的属性,直接调用确实是undefinde, 但也不会 obj.a == undefinded 判断,而是直接判断null,或判断空值就行 if (obj.a == null)if (obj.a), 注意是两等号,会自动类型转换,不能三个等。

就用if就可以了 if (this.$route.query.openid) 就一定不为空了。

单就你的问题来说 if ([null, undefined, ''].indexOf(this.$route.query.openid) > -1)

  1. 如题仅判断undefined null ''的话,题主的代码有误,最后一个!=应改为!==。其次null==undefined
    (且不==其他任何值)前两个仅需保存一个。
  2. 如果只是3种,则不能通过!!flagif(flag)判断,会发生隐式类型转换,比如0falseNaN
新手上路,请多包涵

!!this.$route.query.openid

var o = {
    a: undefined,
    b: null,
    c: ''
}

function isEmpty (t) {
    return !t;
}

isEmpty(o.a);    // true
isEmpty(o.b);    // true
isEmpty(o.c);    // true

ps 不要自己写判断 能lodash就lodash

const nullReg = /^(undefined|null|)$/;
if(!nullReg.test(this.$route.query.openid) && !nullReg.test(window.localStorage.getItem('openid'))) {
  ...
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏