问答中心分类: JAVASCRIPT如何在 JavaScript 中检查空/未定义/空字符串?
0
匿名用户 提问 27分钟 前

有没有string.Empty在 JavaScript 中,还是只是检查""?

Gene T 回复 27分钟 前

仅供参考,我认为 String 类最有用的 API 位于Mozillajavascript工具包. [兴高采烈的.com](elated.com/articles/working-with-strings) 有一个关于 String 的所有属性、方法、… 请注意:Mozilla 链接已更新为developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…

Gene T 回复 27分钟 前

检查这个:stackoverflow.com/a/36491147/7026966

Gene T 回复 27分钟 前

如果明确规定了要求,那将有很大帮助。对于什么价值观应该是空的返回真?检查“”意味着它应该只在值为类型字符串且长度为 0 的情况下返回 true。这里的许多答案假设它也应该为部分或所有错误值返回 true。

Gene T 回复 27分钟 前

长度 > -1

Gene T 回复 27分钟 前

我完全同意@RobG,这个问题定义不好。为什么你会考虑null或者undefined空的?空字符串是空字符串,它不是null或者undefined

Gene T 回复 27分钟 前

此外,一个空字符串不能包含空格,就像很多答案所假设的那样!

Gene T 回复 27分钟 前

@GeneT 的链接已损坏,因此这里是 Mozilla 参考的更新链接:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

29 Answers
0
Jano González 回答 27分钟 前

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

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

(请注意,字符串不是唯一带有length属性,例如,数组也有它们。)
或者,您可以使用(不是这样)新的可选链接和箭头函数来简化:

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

它将检查长度,返回undefined如果是空值,则不会引发错误。在空值的情况下,零是假的,结果仍然有效。
为了检查变量是否为假或字符串是否仅包含空格或为空,我使用:

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

如果你愿意,你可以猴子补丁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());

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

Vincent 回复 27分钟 前

为什么 0 === str.length 而不是 str.length === 0 ?

grandouassou 回复 27分钟 前

@Vincent 条件经常这样写if (variable == constant value)如果您忘记了“=”,那么您将常量值分配给变量而不是测试。该代码仍然可以工作,因为您可以在 if 中分配变量。所以写这个条件更安全的方法是把常量值和变量取反。这样,当你测试你的代码时,你会看到一个错误(Invalid lef-hand side in assignment)。您还可以使用 JSHint 之类的东西来禁止在条件中赋值,并在编写时收到警告。

grandouassou 回复 27分钟 前

我忘了提到,由于您主要使用 ‘===’ 或 ‘!==’ ,因此您很少遇到这种错误。

Adrien Be 回复 27分钟 前

感到羞耻/^\s*$/.test(str)不是真的可读 – 也许使用更简单的代码或正则表达式删除空格会更好?看stackoverflow.com/questions/6623231/…并且stackoverflow.com/questions/10800355/…

khebbie 回复 27分钟 前

我喜欢这样,我将它添加到字符串原型 String.prototype.isEmpty = function () { return (!this || 0 === this.length); };

Schadenfreude 回复 27分钟 前

/^\s*$/.test(str) 可以替换为 str.trim().length === 0

AZ. 回复 27分钟 前

@Vincent 这也称为“尤达条件”,例如if blue is the sky.看dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html

Harsh Pandey 回复 27分钟 前

怎么return (this.length === 0 || !this.trim())比仅仅更好return !this.trim()?

Stephen M Irving 回复 27分钟 前

虽然扩展原生原型并不是一个好主意,但通常认为这是一种不好的做法,很多人只是建议不要完全这样做,因为有更安全的方法同样好。有一个关于这个话题的讨论这里,但我读过的每一本 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 }

Flimm 回复 27分钟 前

空字符串是错误的,所以条件的第二部分并不是真正需要的:(! str || str.length == 0)

johnw182 回复 27分钟 前

这是最好的答案,可以处理我可以测试的所有场景! (isBlank() 之一)

Giorgi Moniava 回复 27分钟 前

@Jano 为什么需要在这里检查长度:return (!str || str.length === 0 )?

0
karthick.sk 回答 27分钟 前

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

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

或使用类型转换:

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

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

  • 它返回false为了null,undefined,0,000,"",false.
  • 它返回true对于空字符串以外的所有字符串值(包括像"0"" ")
Peter Olson 回复 26分钟 前

的行为有什么区别吗if(str)if(!!str)?

John Ruddell 回复 26分钟 前

@PeterOlson如果您尝试将变量保存为检查多个字符串内容的布尔值,那么您会想要这样做..又名var any = (!!str1 && !!str2 && !!str3)处理那里是否也有数字

Dario Oddenino 回复 26分钟 前

这是我一直使用的解决方案。!!str.trim()确保字符串不是仅由空格组成的。

shinzou 回复 26分钟 前

不不看起来像一个黑客,Boolean(str)可读性更强,“wtfish”更少。

Oliver Spryn 回复 26分钟 前

注意!!不是运算符。它是一个运算符应用两次。

Arth 回复 26分钟 前

@JohnRuddell 不是多余的刘海var any = (!!str1 && !!str2 && !!str3)?不会&&运算符无论如何将操作数转换为布尔值?

John Ruddell 回复 26分钟 前

@arth 你可以这样做,这取决于你的代码风格。当我进行布尔检查时,我喜欢通过!!所以你确保一致的行为……当你不处理布尔值时,浏览器实现可能会表现不同

Arth 回复 26分钟 前

@JohnRuddell 为什么浏览器将变量隐式转换为布尔值会在 !运算符和 && 运算符? ..如果可以,为什么要相信一个而不是另一个?

Alvin Thompson 回复 26分钟 前

@Arth @JohnRuddell:不,刘海不是多余的。例如,'aa' && 'ddd'返回'ddd', 不是true.'ddd'碰巧进一步评估为true,这就是为什么你可以只使用'aa' && 'ddd'原样if陈述。但是,如果您将结果分配给布尔值,则需要刘海。

Alvin Thompson 回复 26分钟 前

@JohnRuddell @Arth:换句话说,javascript 的&&除非它选择的操作数恰好是布尔值,否则不会返回布尔值。这是其行为的定义(对于expr1 && expr2): “如果 expr1 可以转换为 true,则返回 expr2;否则,返回 expr1″。

Arth 回复 26分钟 前

@AlvinThompson 啊,是的,我错过了.. 谢谢,好点!分配布尔变量时,需要显式转换,但可以这样做!!(str1 && str2 && str3)或者Boolean(str1 && str2 && str3)反而。不赋值时,显式转换是多余的,if (str1 && str2 && str3){}足够的..

Oli Crt 回复 26分钟 前

这在a中根本没用if,它将虚假值转换为false和真实的价值观true.一个if块是否执行取决于表达式是否真实,没有必要添加!!

sean 回复 26分钟 前

对于那些想知道的人:1。Boolean(expr)!!expr2.Boolean(expr)在 if 里面有点没用; if 已经隐式地转换了其中给出的表达式。例如,对于那些来自 C# 的人来说,这可能会让他们感到惊讶。

johnw182 回复 26分钟 前

这不适用于字符串空格。添加 Darias 建议不适用于空值。

0
Ates Goral 回答 26分钟 前

你能到达的最近的东西str.Empty(前提是 str 是一个字符串)是:

if (!str.length) { ...
Pic Mickael 回复 26分钟 前

那不会抛出异常是str为null吗?

Ates Goral 回复 26分钟 前

@PicMickael 是的!也会str.Empty.

Flimm 回复 26分钟 前

请注意,字符串不是唯一具有length属性。数组也可以。

0
Sugendran 回答 26分钟 前

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

if(str.replace(/\s/g,"") == ""){
}
flash 回复 26分钟 前

但是,如果您真正想要测试的是具有非空格内容的字符串,那么这项工作就可以完成。有没有更便宜的方法来测试这个?

driAn 回复 26分钟 前

长度属性如何?

mpen 回复 26分钟 前

与其删除所有空格,不如只检查是否有非空格?有两个优点,如果有非空格字符,它可以提前退出,并且它没有返回一个新的字符串,然后你检查它。if(str.match(/\S/g)){}

neezer 回复 26分钟 前

@Mark FYI,您不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)

Marecky 回复 26分钟 前

为什么它很贵?如果确实如此,那么为什么 jQuery 使用这种方法?你可以在 jQuery 的源代码中找到它var trimLeft = /^\s+/, trimRight = /\s+$/;

Luke101 回复 26分钟 前

+1我尝试了这种方法,它对我有用。用户可以输入仍然是空白的空格。

vhanla 回复 26分钟 前

if(str.replace(/^\s+|\s+$/g,"")){...}+就足够了

Ates Goral 回复 26分钟 前

也许/\S/.test(str)好于str.match(/\S/)因为它不需要返回一系列匹配的结果(可能是那里的微观性能增益)。此外,当刚刚测试针对正则表达式的字符串,使用正则表达式.test()更好地传达这种意图的方法。

0
Jet 回答 26分钟 前

我用:

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
Jeff Davis 回复 26分钟 前

此解决方案与语言无关。它唯一依赖的 JavaScript 特性是 typeof。因此,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,这是一个很好的解决方案示例。 (IE,无法访问互联网)。这有点像证明。不是最干净的,但你可以确定它会在不了解 JavaScript 的情况下工作。

xarlymg89 回复 26分钟 前

对于未定义的情况,我会更进一步,并使用 === 运算符来确定它。否则,这只是一个完美的答案。

Lucas 回复 26分钟 前

typeof在里面switch对我不起作用。我添加了一个if (typeof e == "undefined")测试并且有效。为什么?

beeThree 回复 26分钟 前

@Lucas因为这是一个错字或疏忽。您的修改是正确的方法。 (原文指的是空函数的上下文,而不是e参数,这是函数应该检查的)

Boris J. 回复 26分钟 前

我们可以使用case undefined:代替case typeof(e) == "undefined":?

Sebastian Simon 回复 26分钟 前

case typeof(e) == "undefined":是错的;匹配一个efalse, 不是undefined.显然这是一个建议编辑获得批准。原本的case typeof this == "undefined":仍然没有任何意义。也没有理由考虑false,0, 和"0"“空的”。

Joseph Hamilton 回复 26分钟 前

只是表明这种美丽的语言是多么可笑:(

Flimm 回复 26分钟 前

此函数返回 trueisEmpty("0"),这对我来说是令人惊讶和不受欢迎的行为。在 Javascript 中,"0"在布尔上下文中被评估为真,所以我不希望它被认为是空的。

Scotty Jamison 回复 26分钟 前

@鲍里斯J。是的,使用case undefined:将是此错误的正确修复。 (我编辑了答案以改用它)。

Scotty Jamison 回复 26分钟 前

这个解决方案和松散的平等一样糟糕(它如何对待'0'作为“空”),并且它是不完整的(如果传入的集合、映射或用户定义的类是否为空,它不会检查),而且它真的没有多大意义(我们为什么要检查数字和布尔值的空虚?那些不是容器)。而且,这是不必要的——您应该知道您正在处理的数据类型,并且能够在现场对其进行适当的空性检查。这将更加清洁和简单。