if判断是否有值,但是这个值为0,它也判了不过请问怎么写呢

CaixK
  • 352
    // row保存
    saveRow (record) {
      const { num, id } = record 
      if (!num) { // 这里为0也走了,怎么判断单纯有没有值
        this.tableLoading = false
        this.$message.error('请填写完整信息。')
        return
      }
    },
回复
阅读 2.1k
12 个回答
✓ 已被采纳

这里先要搞明白 num 允许是哪些值。如果只能是数字的话,可以这样

if (typeof num === "number") { ... }

不过这样的话,num 还有可能是 NaN,一般 NaN 也需要过滤掉(要不要过滤看业务),所以

if (typeof num === "number" && !isNaN(num)) { ... }

接下来,如果逻辑可以保证 num 只会是数字,或者空(含 undefined),那么可以这样判断

if (!(num === undefined || num === null || isNaN(num))) { ... }

如果用新语法 Nullish Coalescing,会简单一些

if (!isNaN(num ?? NaN)) { ... }

如果 NaN 算是合法的,那就得找个不应该出现的值(只能是一个非数字值了,幸好 JS 不绑定类型)

// if (num ?? false !== false) { ... }
// 修改一下,用 null 语义上更舒服一些
if (num ?? null !== null) { ... }

更复杂的情况,如果 "1234" (表示数的字符串)这种也算合法,还是老实的用 typeof

// 代码没测试,小心使用
// 假设 NaN 不合法
function isValudNum(num) {
    switch (typeof num) {
        case "string":
            num = parseInt(num, 10);
            // 如果可能是浮点数用 parseFloat
            // 这里不加 break,需要穿透下去判断 isNaN
        case "number":
            return !isNaN(num);
        default:
            return false;
    }
}

如果 NaN 也合法,处理 "string" 类型的时候会更伤心,因为需要先判断是否数字,用正则表达式判断

case "string":
    return /^\d+$/.test(num);
    // 如果要判断浮点数
    // return /^\d+(?:\.\d+)?$/.test(num);

当然,如果只是做数字判断的话,NaN 不合法的情况下,用下面这个 case "string" 代替上面那个也是没问题的。

使用null或undefined,num == null

双等判断下,undefined和null相等,0和空字符串、false相等

方法1: 编写isNil函数判断

function isNil(value) {
  return value === null || value === undefined
}
if (isNil(num)) {
  ...
}

方法2:用Lodash

import {isNil} from 'lodash'

if (isNil(num)) {
  ...
}

方法3:用新语法,双问号 ??

saveRow (record) {
    // 将错误提示的逻辑用箭头函数(一定要箭头函数,为了this能穿透到上一级作用域)包装
    const tip = ()=> {
        this.tableLoading = false
        this.$message.error('请填写完整信息。')
        return
    }
    const { num, id } = record 
    num ?? tip() // ?? 操作符只会在 num 为null或undefined 执行 ?? 后面的语句
}
if (num || num === 0) {}

看你的变量命名,知道值是个number类型,或许可以换个思路
if (typeof num === 'number')
毕竟false, 空字符串,null,undefined类型各异
当然,要是值没限制类型,那还是别用了

多加一些空值判断,类似这样的

num === '' || num == null || num == undefined

isNaN(num) 数字返回false 或 if(!num && num!=0)

if判断
其值为 0、-0、null、""、false、undefined 或者 NaN,那么if判断 false ,其他为true

虽然上面有很多大佬已经给出了各种方案,但我还是要吐槽一番,因为我也是0的受害者。而且是深受其害,接口字段定义太随便,枚举也都是从0开始定义,导致各种function有意无意的过滤掉,恶心的要死,只能是用全等去解决,但还是有0和"0"的区别的地方,总之一旦有0,就得针对性的去改代码。。。加油

自己封装一个方法

export function isEmpty(v) {
  if (v === '' || v === undefined || v === null) {
    return true
  }

  if (typeof v === 'object') {
    if (Array.isArray(v)) {
      return v.length === 0
    } else {
      return Object.keys(v).length === 0
    }
  }
  return false
}
1343460872
  • 3
新手上路,请多包涵

是0,不过是'0',所以变成false了

const { num, id } = record
判断record是否有某个字段?

Reflect.has(record, 'num')

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
你知道吗?

宣传栏