是否有标准函数来检查 JavaScript 中的 null、未定义或空白变量?

IT技术 javascript null comparison undefined
2021-01-14 06:34:14

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

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

您可以只检查变量是否有truthy值。这意味着

if( value ) {
}

将评估为trueif valueis not

  • 空值
  • 不明确的
  • NaN
  • 空字符串 ("")
  • 0
  • 错误的

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

此外,如果您不知道变量是否存在(也就是说,如果已声明),您应该检查typeof操作符。例如

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

如果您可以确定至少声明了一个变量,则应直接检查它是否具有truthy如上所示值。

如果该值是预期的 false 布尔值怎么办。有时你想在没有值的情况下给出一个默认值,如果传入 false 布尔值,这将不起作用。
2021-03-16 06:34:14
除非值是一个数组。的解释truthy可能会产生误导。在这种情况下,我们应该检查value.length != 0非空数组。
2021-03-17 06:34:14
@TruMan1:在这种情况下(您的逻辑决定验证),您必须像if( value || value === false ). 所有虚假值也是如此,我们需要明确验证这些
2021-04-07 06:34:14
只是想补充一点,如果你觉得if结构在语法上是太重了,你可以使用三元运算符,就像这样:var result = undefined ? "truthy" : "falsy"或者,如果您只想强制转换为布尔值,请使用!!运算符,例如!!1 // true, !!null // false
2021-04-08 06:34:14
另请注意,这不会检查仅包含空白字符的字符串。
2021-04-09 06:34:14

检查值是否未定义或为空的详细方法是:

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

您也可以使用==运算符,但这需要知道所有规则

return value == null; // also returns true if value is undefined
检查只nullundefined可以像这样进行: if (value == null)注意==强制操作的操作员。如果您像这样检查if (value === null || value === undefined),您就会忘记/不知道 Javascript 是如何强制执行的。webreflection.blogspot.nl/2010/10/...
2021-03-26 06:34:14
arg == null 在我的经验中很常见。
2021-04-03 06:34:14
@ChristiaanWesterbeek:您的观点arg == nullarg === undefined || arg === null. 但是,我认为后一个示例更具可读性。
2021-04-04 06:34:14
return value === (void 0)undefined可悲的是比测试可能是范围内的合法变量更安全
2021-04-07 06:34:14
@Sharky 未定义变量和未声明变量之间存在差异:lucybain.com/blog/2014/null-undefined-undeclared
2021-04-09 06:34:14
function isEmpty(value){
  return (value == null || value.length === 0);
}

这将返回真

undefined  // Because undefined == null

null

[]

""

和零参数函数,因为函数length是它所采用的声明参数的数量。

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

function isEmpty(value){
  return (value == null || value === '');
}
undefined == nullundefined !== null
2021-03-17 06:34:14
@IanBoyd 那是因为您将 == 与 === 进行比较。这意味着 undefined == null (true) undefined != null (false) undefined === null (false) undefined !== null(true) 最好提供更多信息以便提供帮助和推动人们在正确的方向。moz doc 关于差异developer.mozilla.org/en-US/docs/Web/JavaScript/...
2021-03-28 06:34:14

这是最安全的检查,我还没有看到它完全像这样发布在这里:

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

它将涵盖从未定义值的情况,以及以下任何一种情况:

  • 空值
  • 未定义(未定义的值与从未定义的参数不同)
  • 0
  • ""(空字符串)
  • 错误的
  • NaN

编辑:更改为严格相等(!==),因为它现在是规范;)

我认为这是最易读的代码。在所有答案中,这应该是公认的。
2021-03-10 06:34:14
我没有反对,但关于严格相等比较,一般规则是除非您需要隐式类型转换,否则应该使用严格比较。
2021-03-11 06:34:14
感谢您的评论史蒂夫。这个一般规则就好了。我只是希望 ppl 理解他们为什么使用其中一个。无论你怎么看,人们都会很高兴地向你宣扬“始终使用严格”——就像它是 Javascript 中最重要的事情一样。我见过太多像if(val !== null)这样的情况,这显然会导致不需要的结果。有疑问时可以说 - 使用严格,但最好不要有疑问。
2021-03-12 06:34:14
@guya 这值得仅仅为 7 年后的编辑投票!尤其是考虑到当天的上述讨论;) 尊敬的先生!
2021-03-13 06:34:14
我认为这里的重点是我们希望typeof运算符返回一个字符串,因此使用严格相等检查在技术上更准确、更具体、更快。所以真的,没有理由使用松散的比较,而不是相反。同样val !== null是在许多情况下完全有效的-我做这一切的时候。我同意你不符合的论点,但我认为这是一个糟糕的例子。不是想骗你。
2021-03-16 06:34:14

您可能会发现以下功能很有用:

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
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map

“请注意,绑定运算符 (::) 不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。它目前是引入该语言的第 0 阶段(稻草人)提案。” – 西蒙·凯尔伯格。作者希望支持这项美丽的升职提议。

事实并非如此,正在尝试使用更具可读性的方式来表达相同的功能:解构赋值、绑定运算符。
2021-03-14 06:34:14
@Vix,为什么 ES7 版本更好?
2021-03-26 06:34:14
请注意,绑定运算符 ( ::) 根本不是 ES2016 (ES7) 的一部分,也不是任何更高版本的 ECMAScript 标准。它目前是引入该语言的第 0 阶段(稻草人)提案。
2021-04-04 06:34:14
+1 了解“regexp”、“array”和“function”类型的对象 很有帮助
2021-04-08 06:34:14