ChatGPT解决这个技术问题 Extra ChatGPT

如何在 JavaScript 中检查空/未定义/空字符串?

我看到了 this question,但没有看到 JavaScript 特定示例。 JavaScript 中有一个简单的 string.Empty,还是只是检查 "" 的一种情况?

仅供参考,我认为 String 类最有用的 API 位于 Mozillajavascript kit。 [elated.com](elated.com/articles/working-with-strings ) 有关于 String 的所有属性、方法的教程... 请注意:Mozilla 链接已更新为 developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
如果明确规定了要求,那将有很大帮助。对于什么值,isEmpty 应该返回 true?检查“”意味着它应该只在值为类型字符串且长度为 0 的情况下返回 true。这里的许多答案假设它也应该为部分或所有错误值返回 true。
长度 > -1
我完全同意@RobG,这个问题定义不好。为什么你会认为 nullundefined 是空的?空字符串是空字符串,它不是 nullundefined

F
Flimm

如果您只想检查是否有 truthy value,您可以执行以下操作:

if (strValue) {
    //do something
}

如果您需要专门检查空字符串是否为空,我认为检查 "" 是您最好的选择,使用 the === operator (这样您就知道它实际上是您要比较的字符串) .

if (strValue === "") {
    //...
}

测试长度属性实际上可能比针对 "" 测试字符串更快,因为解释器不必从字符串文字创建 String 对象。
@Vincent 在 Chrome 开发人员工具中进行了一些简单的分析,测试 === ''.length 并没有显示出任何明显的改进(并且只有在您可以假设您有一个字符串的情况下使用 .length 才有效)
@bdukes 当您开始关心这种微优化时,我不认为 Chrome 是您遇到大部分性能问题的浏览器......
请注意,如果您对“空字符串”的定义包括空格,则此解决方案不合适。一个包含 1 个或多个空格的字符串在上面返回 true。如果您使用的是 JQuery,您可以简单地使用: if ($.trim(ref).length === 0) - 根据类似问题的答案:stackoverflow.com/questions/2031085/…
正如预期的那样,.length > 0 实际上比与字符串文字相比快得多!看看这个jsPerf
j
jhpg

为了检查变量是否为 falsey 或者它的长度属性是否等于零(对于字符串,这意味着它是空的),我使用:

function isEmpty(str) {
    return (!str || str.length === 0 );
}

(请注意,字符串不是唯一具有 length 属性的变量,例如,数组也有它们。)

或者,您可以使用(不是这样)新的可选链接和箭头函数来简化:

const isEmpty = (str) => (!str?.length);

它将检查长度,如果为空值,则返回 undefined,而不会引发错误。在空值的情况下,零是假的,结果仍然有效。

为了检查变量是否为假或字符串是否仅包含空格或为空,我使用:

function isBlank(str) {
    return (!str || /^\s*$/.test(str));
}

如果需要,您可以像这样monkey-patch String 原型:

String.prototype.isEmpty = function() {
    // This doesn't work the same way as the isEmpty function used 
    // in the first example, it will return true for strings containing only whitespace
    return (this.length === 0 || !this.trim());
};
console.log("example".isEmpty());

请注意,猴子修补内置类型是有争议的,因为无论出于何种原因,它都可能破坏依赖于内置类型现有结构的代码。


为什么 0 === str.length 而不是 str.length === 0 ?
@Vincent 条件通常写成这样 if (variable == constant value) 并且如果您忘记了“=”,那么您将常量值分配给变量而不是测试。该代码仍然可以工作,因为您可以在 if 中分配变量。所以写这个条件更安全的方法是把常量值和变量取反。这样,当你测试你的代码时,你会看到一个错误(Invalid lef-hand side in assignment)。您还可以使用 JSHint 之类的东西来禁止在条件中赋值,并在编写时收到警告。
/^\s*$/.test(str) 可以替换为 str.trim().length === 0
@Vincent 这也称为“尤达条件”,如 if blue is the sky。请参阅dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
虽然扩展原生原型并不是一个好主意,但通常认为这是一种不好的做法,很多人只是建议不要完全这样做,因为有更安全的方法同样好。关于主题 here 有一个 SO 讨论,但我读过的每一本 JS 编程书籍都强烈反对它。对于 OPs 问题,我通常只做 if (!str) { // i am sure str is empty null or undefined here if I'm sure it won't be another data type }
F
Flimm

以前的所有答案都很好,但这会更好。使用双重 NOT 运算符 (!!):

if (!!str) {
    // Some code here
}

或使用类型转换:

if (Boolean(str)) {
    // Code here
}

两者都执行相同的功能。将变量类型转换为布尔值,其中 str 是一个变量。

对于 null、未定义、0、000、""、false,它返回 false。

它对除空字符串以外的所有字符串值返回 true(包括“0”和“”等字符串)


if(str)if(!!str) 的行为有什么区别吗?
@PeterOlson,如果您尝试将变量保存为检查多个字符串的内容的布尔值,那么您会想要这样做.. aka var any = (!!str1 && !!str2 && !!str3) 处理如果那里也有数字
这是我一直使用的解决方案。 !!str.trim() 以确保字符串不是仅由空格组成的。
看起来不像是 hack,Boolean(str) 可读性更高,“wtfish”更少。
这在 if 中根本没用,它将虚假值转换为 false,将真实值转换为 trueif 块是否执行取决于表达式是否为真,添加 !! 没有意义
K
Kick Buttowski

您可以得到的最接近 str.Empty 的东西(前提是 str 是一个字符串)是:

if (!str.length) { ...

那不会抛出异常是str为null吗?
@PicMickael 是的! str.Empty 也是如此。
请注意,字符串不是唯一具有 length 属性的变量类型。数组也可以。
S
Sugendran

如果您需要确保字符串不仅仅是一堆空格(我假设这是用于表单验证),您需要对空格进行替换。

if(str.replace(/\s/g,"") == ""){
}

但是,如果您真正想要测试的是具有非空格内容的字符串,那么这项工作就可以完成。有没有更便宜的方法来测试这个?
长度属性如何?
与其删除所有空格,不如只检查是否有非空格?有两个优点,如果有非空格字符,它可以提前退出,并且它没有返回一个新的字符串,然后你检查它。 if(str.match(/\S/g)){}
@Mark FYI,您不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)
或许 /\S/.test(str)str.match(/\S/) 更好,因为它不需要返回一组匹配的结果(可能是那里的微性能增益)。此外,当仅针对正则表达式测试字符串时,请使用 RegExp .test() 方法更好地传达该意图。
S
Scotty Jamison

我用:

function empty(e) {
  switch (e) {
    case "":
    case 0:
    case "0":
    case null:
    case false:
    case undefined:
      return true;
    default:
      return false;
  }
}

empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
    return ""
})) // false

此解决方案与语言无关。它唯一依赖的 JavaScript 特性是 typeof。因此,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,这是一个很好的解决方案示例。 (IE,无法访问互联网)。这有点像证明。不是最干净的,但你可以确定它会在不了解 JavaScript 的情况下工作。
对于未定义的情况,我会更进一步,并使用 === 运算符来确定它。否则,这只是一个完美的答案。
switch 中的 typeof 对我不起作用。我添加了一个 if (typeof e == "undefined") 测试并且有效。为什么?
@Lucas因为这是一个错字或疏忽。您的修改是正确的方法。 (原文指的是空函数的上下文,而不是e参数,这是函数应该检查的)
case typeof(e) == "undefined": 错误;匹配 falsee,而不是 undefined。显然这是一个获得批准的suggested edit。原来的 case typeof this == "undefined": 仍然没有任何意义。也没有理由将 false0"0" 视为“空”。
K
Kamil Kiełczewski

表现

我在 macOS v10.13.6 (High Sierra) 上针对 18 个选定的解决方案进行了测试。解决方案的工作方式略有不同(对于极端情况输入数据),如下面的片段中所示。

结论

基于 !str,==,=== 和 length 的简单解决方案适用于所有浏览器(A、B、C、G、I、J)

基于正则表达式 (test,replace) 和 charAt 的解决方案对于所有浏览器 (H,L,M,P) 来说都是最慢的

标记为最快的解决方案仅在一次测试运行中最快 - 但在许多运行中它会在“快速”解决方案组内发生变化

https://i.stack.imgur.com/bFeGV.png

细节

在下面的片段中,我通过使用不同的输入参数比较了选择的 18 种方法的结果

"" "a" " " - 空字符串、带字母的字符串和带空格的字符串

[] {} f- 数组、对象和函数

1 NaN 无穷大 - 数字

true false - 布尔值

空未定义

并非所有经过测试的方法都支持所有输入案例。

函数 A(str) { 让 r=1;如果 (!str) r=0;返回 r; } 函数 B(str) { 让 r=1;如果 (str == "") r=0;返回 r; } 函数 C(str) { 让 r=1;如果 (str === "") r=0;返回 r; } 函数 D(str) { 让 r=1; if(!str || 0 === str.length) r=0;返回 r; } 函数 E(str) { 让 r=1; if(!str || /^\s*$/.test(str)) r=0;返回 r; } 函数 F(str) { 让 r=1; if(!Boolean(str)) r=0;返回 r; } 函数 G(str) { 让 r=1; if(! ((typeof str != 'undefined') && str) ) r=0;返回 r; } 函数 H(str) { 让 r=1; if(!/\S/.test(str)) r=0;返回 r; } 函数 I(str) { 让 r=1;如果 (!str.length) r=0;返回 r; } 函数 J(str) { 让 r=1; if(str.length <= 0) r=0;返回 r; } 函数 K(str) { 让 r=1; if(str.length === 0 || !str.trim()) r=0;返回 r; } 函数 L(str) { 让 r=1; if ( str.replace(/\s/g,"") == "") r=0;返回 r; } 函数 M(str) { 让 r=1; if((/^\s*$/).test(str)) r=0;返回 r; } 函数 N(str) { 让 r=1; if(!str || !str.trim().length) r=0;返回 r; } 函数 O(str) { 让 r=1; if(!str || !str.trim()) r=0;返回 r; } 函数 P(str) { 让 r=1; if(!str.charAt(0)) r=0;返回 r; } 函数 Q(str) { 让 r=1; if(!str || (str.trim()=='')) r=0;返回 r; } 函数 R(str) { 让 r=1; if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str) || /^\ s*$/.test(str) || str.replace(/\s/g,"") === "") r=0;返回 r; } // --- 测试 --- console.log( ' "" "a" " " [] {} 0 1 NaN Infinity f true false null undefined ');让 log1 = (s,f)=> console.log(`${s}: ${f("")} ${f("a")} ${f(" ")} ${f([ ])} ${f({})} ${f(0)} ${f(1)} ${f(NaN)} ${f(Infinity)} ${f(f)} ${f( true)} ${f(false)} ${f(null)} ${f(undefined)}`);让 log2 = (s,f)=> console.log(`${s}: ${f("")} ${f("a")} ${f(" ")} ${f([ ])} ${f({})} ${f(0)} ${f(1)} ${f(NaN)} ${f(Infinity)} ${f(f)} ${f(真)} ${f(假)}`);让 log3 = (s,f)=> console.log(`${s}: ${f("")} ${f("a")} ${f(" ")}`); log1('A', A); log1('B', B); log1('C', C); log1('D', D); log1('E', E); log1('F', F); log1('G', G); log1('H', H); log2('我', 我); log2('J', J); log3('K', K); log3('L', L); log3('M', M); log3('N', N); log3('O', O); log3('P', P); log3('Q', Q); log3('R', R);

然后对于所有方法,我为 Chrome v78.0.0、Safari v13.0.4 和 Firefox v71.0.0 执行速度测试用例 str = "" - 您可以在您的机器上运行测试here

https://i.stack.imgur.com/IxaPG.png


有点误导,因为它结合了修剪解决方案和无修剪解决方案。
P
Peter Mortensen

您可以使用 lodash:_.isEmpty(value)。

它涵盖了很多情况,如 {}''nullundefined 等。

但它总是为 Number 类型的 JavaScript primitive data types 返回 true,如 _.isEmpty(10)_.isEmpty(Number.MAX_VALUE) 都返回 true


_.isEmpty(" "); // => false
@Erich 因为 " " 不为空。 _.isEmpty(""); 返回真。
非常正确 - 我提到这一点是因为这里的一些其他答案暗示表单验证和检查字符串是否仅包含空格,而这个单一的 lodash 函数本身并不能解决这个问题。
T
T.Todua

非常通用的“一体化”功能(虽然不推荐):

function is_empty(x)
{
    return (                                                           //don't put newline after return
        (typeof x == 'undefined')
              ||
        (x == null)
              ||
        (x == false)        //same as: !x
              ||
        (x.length == 0)
              ||
        (x == 0)            // note this line, you might not need this. 
              ||
        (x == "")
              ||
        (x.replace(/\s/g,"") == "")
              ||
        (!/[^\s]/.test(x))
              ||
        (/^\s*$/.test(x))
    );
}

但是,我不建议使用它,因为您的目标变量应该是特定类型(即字符串、数字或对象?),因此请应用与该变量相关的检查。


你有机会解释每张支票的作用吗? :)
-1 他们正在测试不同的东西。将它们全部放在一个 if 语句中是没有意义的。
typeof MyVariable == 'undefined' 不区分具有未定义值的已初始化变量和未声明变量,除非该变量最初已声明并初始化为 null。检查长度属性会导致字符串原语被包装在字符串对象中。
c
cllpse
var s; // undefined
var s = ""; // ""
s.length // 0

JavaScript 中没有任何内容代表空字符串。对 length(如果您知道 var 始终是字符串)或 "" 进行检查


我不明白这句话:There's nothing representing an empty string in JavaScript. "" 怎么样,不代表一个空字符串吗?
a
afuzzyllama

尝试:

if (str && str.trim().length) {  
    //...
}

根据我自己的测试结果,str.trim().length 会比 str.trim() 快 1% 左右。
OP 正在寻找空字符串、未定义或 null 的测试。这是测试不是任何这些条件的字符串。他也没有说任何关于空白字符串的事情。只要您确定变量中没有存储其他数据类型,您就可以测试 OP 的条件:if (!str) { ... }
P
Peter Mortensen

我不会太担心最有效的方法。使用对您的意图最清楚的内容。对我来说,这通常是 strVar == ""

根据 Constantin 的评论,如果 strVar 最终会包含一个整数 0 值,那么这确实是那些意图澄清的情况之一。


馊主意。如果 strVar 被意外分配为 0,您将得到 true。
我同意明确您的意图比其他方法可能产生的任何微优化更重要,但使用 strict comparison operator === 会更好。仅当 strVar 为空字符串时才返回 true。
如果未定义,则检查失败。所以 if(str) 效果更好
@ValentinHeinitz 如果 str 被分配一个虚假值 0 或“0”, if(str) 将错误地报告为真。最好的方法是 if(str === "")。这很简单,它永远不会失败。
P
Peter Mortensen

您也可以使用正则表达式:

if((/^\s*$/).test(str)) { }

检查为空或填充有空格的字符串。


它有效,但在运营方面也非常昂贵。如果您只想检查一两件事,而不是一大堆,那就太好了。
P
Praveen M P

很多答案,还有很多不同的可能性!

毫无疑问,为了快速简单的实施,获胜者是:if (!str.length) {...}

但是,还有许多其他示例可用。我建议最好的功能方法:

function empty(str) { if (typeof str == 'undefined' || !str || str.length === 0 || str === "" || !/[^\s]/.test(str ) || /^\s*$/.test(str) || str.replace(/\s/g,"") === "") 返回真;否则返回假; }

有点过分,我知道。


检查未定义需要在检查中移到第一个,否则未定义项将在早期检查中引发异常。
完全同意!不错的收获。我将编辑我上面的答案!
str.length === 0 对于没有形式参数的任何函数都返回 true。
str.length === 0 || str === "" 两者都会做同样的任务。
K
Kruti Patel

检查 var a;存在删除值中的错误空格,然后测试是否为空 if ((a)&&(a.trim()!='')) { // 如果变量 a 不为空,请执行此操作 }


字符串 " " 不为空,但在此条件下会被视为空。
P
Peter Mortensen

我通常使用这样的东西,

if (!str.length) {
    // Do something
}

如果您知道变量是字符串,则最快。如果变量未定义,则引发错误。
@AdrianHope-Balie 为什么要测试未定义的变量?
@AbimaelMartell 为什么不呢?您有一个变量,要么是您声明的,要么是从您无法控制的某个范围传递给您的,例如来自方法或 API 调用的响应。您可以假设它包含一个值并使用上面的检查,但如果它未定义或为空,您将收到错误。变种测试=空; if(!test.length){alert("adrian 错了");}
OP 询问“如何检查空字符串”,未定义的变量不是空字符串。无论如何,您可以在检查是否为空之前检查 typeof variable != "undefined"
P
Peter Mortensen

此外,如果您将空格填充的字符串视为“空”。

您可以使用以下正则表达式对其进行测试:

!/\S/.test(string); // Returns true if blank.

J
Josef.B

如果一个人不仅需要检测空字符串,还需要检测空字符串,我将添加到 Goral 的答案中:

function isEmpty(s){
    return !s.length;    
}

function isBlank(s){
    return isEmpty(s.trim());    
}

P
Peter Mortensen

从...开始:

return (!value || value == undefined || value == "" || value.length == 0);

查看最后一个条件,如果 value == "",则它的长度必须为 0。因此删除它:

return (!value || value == undefined || value == "");

可是等等!在 JavaScript 中,空字符串为假。因此,丢弃值 == "":

return (!value || value == undefined);

并且 !undefined 为真,因此不需要检查。所以我们有:

return (!value);

而且我们不需要括号:

return !value

如果 value = falsevalue = 0 会发生什么。你会根据问题返回正确的答案吗?
W
Will

我使用组合,最快的检查是第一个。

function isBlank(pString) {
    if (!pString) {
        return true;
    }
    // Checks for a non-white space character
    // which I think [citation needed] is faster
    // than removing all the whitespace and checking
    // against an empty string
    return !/[^\s]+/.test(pString);
}

只是想知道您是否可以解释何时需要进行长度检查?不会 !pString 捕获任何空/空字符串吗?这似乎有效。变种测试=''; if (!test) alert('empty');
直到十年后我才看到这条评论。但是,是的,你是对的,我会更新的。 :)
一次结合我们的知识 10 年 :)
@Nicholi 2031 年见!
B
Bikush

我没有注意到考虑到字符串中可能存在空字符的答案。例如,如果我们有一个空字符串:

var y = "\0"; // an empty string, but has a null character
(y === "") // false, testing against an empty string does not work
(y.length === 0) // false
(y) // true, this is also not expected
(y.match(/^[\s]*$/)) // false, again not wanted

为了测试它的空性,可以做这样的事情:

String.prototype.isNull = function(){ 
  return Boolean(this.match(/^[\0]*$/)); 
}
...
"\0".isNull() // true

它适用于空字符串和空字符串,并且可用于所有字符串。此外,它可以扩展为包含其他 JavaScript 空字符或空白字符(即不间断空格、字节顺序标记、行/段落分隔符等)。


有趣的分析。我认为这与 99.9% 的情况无关。但我最近发现,如果(且仅当)该列包含空字符(“\0”),MySQL 会将列评估为“空”。另一方面,Oracle 不会将 "\0" 评估为空,而是将其视为长度为 1 的字符串(其中一个字符是空字符)。如果处理不当,这可能会导致混乱,因为许多 Web 开发人员确实使用后端数据库,这可能会传递不同类型的“空”值。它应该在每个开发人员的脑海中。
I
Imran Ahmad

同时,我们可以有一个函数来检查所有“空”,例如 null、undefined、''、''、{}、[]。所以我只写了这个。

var isEmpty = function(data) {
    if(typeof(data) === 'object'){
        if(JSON.stringify(data) === '{}' || JSON.stringify(data) === '[]'){
            return true;
        }else if(!data){
            return true;
        }
        return false;
    }else if(typeof(data) === 'string'){
        if(!data.trim()){
            return true;
        }
        return false;
    }else if(typeof(data) === 'undefined'){
        return true;
    }else{
        return false;
    }
}

用例和结果。

console.log(isEmpty()); // true
console.log(isEmpty(null)); // true
console.log(isEmpty('')); // true
console.log(isEmpty('  ')); // true
console.log(isEmpty(undefined)); // true
console.log(isEmpty({})); // true
console.log(isEmpty([])); // true
console.log(isEmpty(0)); // false
console.log(isEmpty('Hey')); // false

P
Peter Mortensen

我对如果将非字符串和非空/空值传递给测试器函数会发生什么进行了一些研究。众所周知, (0 == "") 在 JavaScript 中是正确的,但由于 0 是一个值,而不是空或 null,您可能需要对其进行测试。

以下两个函数仅对未定义、null、空/空白值返回 true,对其他所有值(例如数字、布尔值、对象、表达式等)返回 false。

function IsNullOrEmpty(value)
{
    return (value == null || value === "");
}
function IsNullOrWhiteSpace(value)
{
    return (value == null || !/\S/.test(value));
}

存在更复杂的示例,但这些示例很简单并且给出了一致的结果。无需测试未定义,因为它包含在 (value == null) 检查中。您还可以通过将它们添加到 String 来模仿 C# 行为,如下所示:

String.IsNullOrEmpty = function (value) { ... }

你不想把它放在 Strings 原型中,因为如果 String-class 的实例为 null,它会报错:

String.prototype.IsNullOrEmpty = function (value) { ... }
var myvar = null;
if (1 == 2) { myvar = "OK"; } // Could be set
myvar.IsNullOrEmpty(); // Throws error

我使用以下值数组进行了测试。如果有疑问,您可以循环它以测试您的功能。

// Helper items
var MyClass = function (b) { this.a = "Hello World!"; this.b = b; };
MyClass.prototype.hello = function () { if (this.b == null) { alert(this.a); } else { alert(this.b); } };
var z;
var arr = [
// 0: Explanation for printing, 1: actual value
    ['undefined', undefined],
    ['(var) z', z],
    ['null', null],
    ['empty', ''],
    ['space', ' '],
    ['tab', '\t'],
    ['newline', '\n'],
    ['carriage return', '\r'],
    ['"\\r\\n"', '\r\n'],
    ['"\\n\\r"', '\n\r'],
    ['" \\t \\n "', ' \t \n '],
    ['" txt \\t test \\n"', ' txt \t test \n'],
    ['"txt"', "txt"],
    ['"undefined"', 'undefined'],
    ['"null"', 'null'],
    ['"0"', '0'],
    ['"1"', '1'],
    ['"1.5"', '1.5'],
    ['"1,5"', '1,5'], // Valid number in some locales, not in JavaScript
    ['comma', ','],
    ['dot', '.'],
    ['".5"', '.5'],
    ['0', 0],
    ['0.0', 0.0],
    ['1', 1],
    ['1.5', 1.5],
    ['NaN', NaN],
    ['/\S/', /\S/],
    ['true', true],
    ['false', false],
    ['function, returns true', function () { return true; } ],
    ['function, returns false', function () { return false; } ],
    ['function, returns null', function () { return null; } ],
    ['function, returns string', function () { return "test"; } ],
    ['function, returns undefined', function () { } ],
    ['MyClass', MyClass],
    ['new MyClass', new MyClass()],
    ['empty object', {}],
    ['non-empty object', { a: "a", match: "bogus", test: "bogus"}],
    ['object with toString: string', { a: "a", match: "bogus", test: "bogus", toString: function () { return "test"; } }],
    ['object with toString: null', { a: "a", match: "bogus", test: "bogus", toString: function () { return null; } }]
];

如果您只是停止使用 == 并使用 ===,那么 if(s === "") 就可以解决问题。
P
Peter Mortensen

我在这里没有看到好的答案(至少不是适合我的答案)

所以我决定回答自己:

value === undefined || value === null || value === "";

您需要开始检查它是否未定义。否则您的方法可能会爆炸,然后您可以检查它是否等于 null 或等于空字符串。

你不能有!!或者只有 if(value),因为如果您检查 0,它会给您一个错误的答案(0 是错误的)。

话虽如此,将其包装在如下方法中:

public static isEmpty(value: any): boolean { return value === undefined || value === null || value === ""; }

PS.:你不需要检查typeof,因为它甚至在它进入方法之前就会爆炸并抛出


可能更好地使用将未定义和空值(以及 0、-0、false、NaN)视为 false 的 Boolean(value) 构造。请参阅stackoverflow.com/questions/856324/…
s
sean

使用 null-coalescing 运算符修剪空白:

if (!str?.trim()) {
  // do something...
}

它看起来很酷,但 str.trim() 就足够了。永远不要让 IMO 的事情变得过于复杂。
只是把它扔给那些可能需要它的人。 ?. 再复杂不过了。如果 str 为空,.trim() 将引发错误。
C
CroMagnon

尝试这个:

export const isEmpty = string => (!string || !string.length);

P
Peter Mortensen

所有这些答案都很好。

但我不能确定变量是一个字符串,不只包含空格(这对我很重要),并且可以包含“0”(字符串)。

我的版本:

function empty(str){
    return !str || !/[^\s]+/.test(str);
}

empty(null); // true
empty(0); // true
empty(7); // false
empty(""); // true
empty("0"); // false
empty("  "); // true

jsfiddle 上的示例。


嗯?如果您需要一个字符串,empty(0)empty(7) 应该返回相同的值。
在我的特殊情况下 - empty("0") 必须返回 false (因为它不是空字符串),但 empty(0) 必须返回 true 因为它是空的:)
但是 0 不是 空的!它是一个数字,数字不能是满的或空的。当然,这是您的函数,因此必须满足您的要求,但在这种情况下 empty 是一个误导性名称。
我认为empty这个名字很好。在 empty 函数的 php 文档中:Returns FALSE if var exists and has a non-empty, non-zero value. Otherwise returns TRUE. PHP 和此函数之间的区别 - 字符串 '0' 不会被识别为空。
正如我所说,这是你的功能:你想要什么就怎么称呼它。但 empty 是一个不准确且具有误导性的名称。有趣的是,PHP 也有一个名称不佳的 empty 函数,但 PHP 的失败与 JavaScript 没有任何关系。
I
Ibraheem
if ((str?.trim()?.length || 0) > 0) {
   // str must not be any of:
   // undefined
   // null
   // ""
   // " " or just whitespace
}

更新:由于这个答案越来越流行,我想我也会写一个函数形式:

const isNotNilOrWhitespace = input => (input?.trim()?.length || 0) > 0;

const isNilOrWhitespace = input => (input?.trim()?.length || 0) === 0;

你能给出更多解释吗?
A
Agustí Sánchez

没有 isEmpty() 方法,您必须检查类型和长度:

if (typeof test === 'string' && test.length === 0){
  ...

testundefinednull 时,需要进行类型检查以避免运行时错误。


我很确定 test === "" 是等价的,而且它更短。
P
Peter Mortensen

忽略空白字符串,您可以使用它来检查 null、空和未定义:

var obj = {};
(!!obj.str) // Returns false

obj.str = "";
(!!obj.str) // Returns false

obj.str = null;
(!!obj.str) // Returns false

它很简洁,适用于未定义的属性,尽管它不是最易读的。


您在这里检查真实性,这比仅检查空字符串 undefinednull 要复杂一些