题 是否有一个标准函数来检查JavaScript中的null,undefined或blank变量?


是否有通用的JavaScript函数来检查变量是否具有值并确保它不是 undefined 要么 null?我有这个代码,但我不确定它是否涵盖所有情况:

function isEmpty(val){
    return (val === undefined || val == null || val.length <= 0) ? true : false;
}

1609
2018-04-01 15:14


起源


可能重复 你如何检查JavaScript中的空字符串? - Dour High Arch
我做了一个测试小提琴: jsfiddle.net/J7m7m/886 - D-Money
Protip,永远不会 (truthy statement) ? true : false;。做就是了 (truthy statement);。 - David Baucum
可能重复 你如何检查JavaScript中的空字符串? - George Jempty
@GeorgeJempty不是一个副本,因为另一个答案要求 字符串 特别是,这个问题 变量。 - Madbreaks


答案:


你可以检查一下 变量 有一个 truthy 价值与否。这意味着

if( value ) {
}

将评估为 true 如果 value 是

  • 空值
  • 未定义
  • 为NaN
  • 空字符串(“”)
  • 0

以上列表代表所有可能的 falsy 值ECMA-/ JavaScript的。在中找到它 规范 在 ToBoolean 部分。

此外,如果你不这样做 知道 变量是否存在(即,是否存在) 声明你应该检查一下 typeof 运营商。例如

if( typeof foo !== 'undefined' ) {
    // foo could get resolved and it's defined
}

如果你可以肯定的是一个 变量 至少声明,你应该直接检查它是否有 truthy 价值如上所示。

进一步阅读: http://typeofnan.blogspot.com/2011/01/typeof-is-fast.html


3313
2018-04-01 15:17



如果该值是假的布尔值,该怎么办?如果没有值,有时你想给出一个默认值,如果传入false boolean则不会有效。 - TruMan1
@ TruMan1:在这种情况下(你的逻辑决定了验证),你必须这样做 if( value || value === false )。同样适用于所有人 虚假的价值观,我们需要明确地验证这些。 - jAndy
除非值是数组。解释 truthy 可能会误导。在那种情况下,我们应该检查 value.length != 0 对于非空数组。 - user
只想添加,如果你觉得 if 构造在语法上太重了,你可以使用三元运算符,如下所示: var result = undefined ? "truthy" : "falsy"。或者,如果您只想强制转换为布尔值,请使用 !! 运算符,例如 !!1 // true, !!null // false。 - KFL
另请注意,这不会检查仅包含空格字符的字符串。 - Christophe Roussy


检查值是未定义还是null的详细方法是:

return value === undefined || value === null;

你也可以使用 == 运营商,但这需要一个 了解所有规则

return value == null; // also returns true if value is undefined

151
2018-04-01 15:20



仅检查 null 要么 undefined 可以这样做: if (value == null)。记住 == 强迫的运营商。如果你这样检查 if (value === null || value === undefined),你忘了/不知道Javascript如何强制。 webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek
@ChristiaanWesterbeek:你的观点 arg == null 产生相同的结果 arg === undefined || arg === null。但是,我认为后一个例子更具可读性。 - Salman A
arg == null 在我的经历中很常见。 - Bryan Downing
return value === (void 0) 比测试更安全 undefined 遗憾的是,这可能是范围内的合理变量。 - x0n
@Sharky未定义的变量和未声明的变量之间存在差异: lucybain.com/blog/2014/null-undefined-undeclared - Christiaan Westerbeek


function isEmpty(value){
  return (value == null || value.length === 0);
}

这将返回true

undefined  // Because undefined == null

null

[]

""

并且由于功能的零点参数的函数 length 是它所声明的参数的数量。

要禁止后一类,您可能只想检查空字符串

function isEmpty(value){
  return (value == null || value === '');
}

55
2018-04-01 15:19



undefined == null 但 undefined !== null - Ian Boyd
@IanBoyd那是因为你正在比较==到===。这意味着undefined == null(true)undefined!= null(false)undefined === null(false)undefined!== null(true)最好提供更多信息以便提供帮助并推动人们在正确的方向。 moz doc就差异而言 developer.mozilla.org/en-US/docs/Web/JavaScript/... - Corey Young
@AdamLeggett,诚实不会进入它。 - Mike Samuel
对不起,我误读了。 - Adam Leggett


我知道这是一个老问题,但这是最安全的检查,我没有看到它在这里发布完全相同:

if (typeof value != 'undefined' && value) {
    //deal with value'
};

它将涵盖案件  从未定义过,以及任何这些:

  • 空值
  • undefined(undefined的值与从未定义的参数不同)
  • 0
  • “”(空字符串)
  • 为NaN

附:没有必要严格平等 typeof value!='undefined'


26
2017-11-10 16:13



什么是投票??!一些严格的平等狂热在房子里。哦,等等,你被告知要始终使用严格的平等,你总是做你被告知的事情,不是吗? - guya
我没有投票,但就严格的平等比较而言,一般规则是除非你 需要 应使用隐式类型转换,而不是严格比较。 - J.Steve
谢谢你的评论史蒂夫。这个一般规则就好了。我希望ppl能够理解为什么他们使用其中一个。你看待ppl的每一种方式都会很高兴地传播你“永远使用严格” - 就像它是Javascript中最重要的东西。我见过太多像这样的案例 if(val!== null) 这显然会导致不必要的结果。可以说,当有疑问时 - 使用严格,但最好不要怀疑。 - guya
我认为这里的重点是我们期待的 typeof 运算符返回一个字符串,因此使用严格的相等性检查在技术上更准确,更具体,更快。所以真的,没有理由使用宽松的比较,而不是相反。也 val !== null 在很多情况下是完全有效的 - 我一直这样做。我同意你的不合规论点,但我认为这是一个很好的例子。不试图哄骗你。 - Bryan Downing
Thanx为你的评论Bryan,你使用val!== null因为你知道你在做什么。初学者希望有一个回归到val是假的时候。但是,val永远不会为null,它将是未定义的。如果他不听“永远使用严格”的建议,他就会有更少的错误。我见过这种情况发生在生产代码中。 typeof总是返回一个字符串,速度差异将是多余的。因此,在上述情况下使用strict的唯一论据是一致性。我说过“不需要严格的平等”。这并不意味着你不能,如果你想要或者它使你的代码更加一致。 - guya


评分最高的第一个答案是错误的。如果value未定义,它将在现代浏览器中引发异常。你必须使用:

if (typeof(value) !== "undefined" && value)

要么

if (typeof value  !== "undefined" && value)

25
2018-03-19 13:23



eee ...我认为这是错误的,因为if(value)就足够了(除了空对象/数组)。如果值为“未定义”,则“if”配置将不会通过。 - Oskar Szura
这会混淆未定义的变量(在评估时抛出ReferenceError),这些变量与变量不同 undefined 值。 - Qantas 94 Heavy
我在这里得到了同样的错误。 if(x),if(!x),if(!! x)如果x未定义则全部抛出错误。 - shaosh
if(value === 0) gameOver();  ;) - Madbreaks
这个答案也是错误的,因为它返回false时 value 是零,这是 不 op正在寻找什么。 - Madbreaks


您可能会发现下面的功能非常有用:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}

或者在ES7中(如果进一步改进则发表评论)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}

结果:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date

“请注意,绑定运算符(::)不是ES2016(ES7)的一部分,也不是ECMAScript标准的任何后续版本。它目前是引入该语言的第0阶段(草编)提议。” - 西蒙谢尔贝格。作者希望加入他对这一美丽提案的支持,以获得皇室提升。


23
2018-02-12 10:32



+1知道类型的对象是有帮助的 “正则表达式”,'数组'和'功能' - Yash
@Vix,为什么ES7版本更好? - GollyJer
它不是,正在尝试使用更可读的方式来表达相同的功能:解构赋值,绑定运算符。 - Vix
请注意绑定运算符(::)根本不是ES2016(ES7)的一部分,也不是ECMAScript标准的任何后续版本。它目前是一个引入该语言的第0阶段(草编)提案。 - Simon Kjellberg


 检查空字符串(“”),null,undefined,false以及数字0和NaN。比如说,如果一个字符串是空的 var name = "" 然后 console.log(!name) 回报 true

function isEmpty(val){
  return !val;
}

如果,此函数将返回true VAL 是 empty,null,undefined,false,数字0或NaN


16
2018-01-23 06:56



这并不能说明变量是否为空,因为false和0可以是有效值而不构成空值。具有isEmpty函数的值是确保您期望的值为空的值返回true。在我看来,null,undefined,NaN和一个空字符串是有意义的值为空。 - Corey Young
为何使用 isEmpty(val) 如果你能做到的话 !val? - Allen Linatoc
它是由你决定。您可以使用它来提高可读性。否则,如果你认为你工作的团队他们是更先进的编码员,那么你可以使用 !val 要么 !!val 根据您的问题域名。 - Arif


你有点过头了。要检查变量是否未赋值,您只需要检查undefined和null。

function isEmpty(value){
    return (typeof value === "undefined" || value === null);
}

这是假设 0""和对象(甚至是空对象和数组)都是有效的“值”。


10
2018-04-01 15:21



仅检查 null 要么 undefined 可以这样做: if (value == null)。记住 == 强迫的运营商。如果你这样检查 if (value === null || value === undefined),你忘了/不知道Javascript如何强制。 webreflection.blogspot.nl/2010/10/... - Christiaan Westerbeek


这是我的 - 如果value为null,undefined等等或空白(即仅包含空格),则返回true:

function stringIsEmpty(value) {

    return value ? value.trim().length == 0 : true;

}

9
2018-02-12 15:45





如果你更喜欢普通的javascript试试这个:

  /**
   * Checks if `value` is empty. Arrays, strings, or `arguments` objects with a
   * length of `0` and objects with no own enumerable properties are considered
   * "empty".
   *
   * @static
   * @memberOf _
   * @category Objects
   * @param {Array|Object|string} value The value to inspect.
   * @returns {boolean} Returns `true` if the `value` is empty, else `false`.
   * @example
   *
   * _.isEmpty([1, 2, 3]);
   * // => false
   *
   * _.isEmpty([]);
   * // => true
   *
   * _.isEmpty({});
   * // => true
   *
   * _.isEmpty('');
   * // => true
   */

function isEmpty(value) {
    if (!value) {
      return true;
    }
    if (isArray(value) || isString(value)) {
      return !value.length;
    }
    for (var key in value) {
      if (hasOwnProperty.call(value, key)) {
        return false;
      }
    }
    return true;
  }

否则,如果您已经使用下划线或lodash,请尝试:

_.isEmpty(value)

7
2017-08-21 13:39



试过你的代码。我在控制台中收到一条错误消息:“未捕获的引用错误:isArray()未定义”。否则,如果有效的话会很棒。 - crmprogdev
至少在lodash的情况下, _.isNil 是你正在寻找的功能,而不是 _.isEmpty。 isNil文档, isEmpty文档 - Snixtor
如果value为boolean且值为true,则会失败。 - kalyanbk
普通的javascript没有 isArray 要么 isString 功能上 window。 - GFoley83
@ GFoley83 - 你抓住了我!我有我不使用Windows的原因。实际上,我在讨论软件语言历史和进展的章节中讨论了这个主题。更多相关信息可能是我的书中学习Monadic错误处理的讨论/代码,在Go中学习函数式编程。干杯! - l3x