如何在 JavaScript 中检查空/未定义/空字符串?
Posted
技术标签:
【中文标题】如何在 JavaScript 中检查空/未定义/空字符串?【英文标题】:How can I check for an empty/undefined/null string in JavaScript? 【发布时间】:2010-09-14 07:41:49 【问题描述】:我看到了this question,但我没有看到 javascript 特定的示例。 JavaScript 中是否有一个简单的string.Empty
可用,还是只是检查""
的情况?
【问题讨论】:
仅供参考,我认为对 String 类最有用的 API 位于 Mozilla 和 javascript kit。 [elated.com](elated.com/articles/working-with-strings ) 有关于 String 的所有属性、方法、...的教程。请注意:Mozilla 链接已更新为developer.mozilla.org/en/JavaScript/Reference/Global_Objects/… 检查这个:***.com/a/36491147/7026966 如果需求被明确说明会大有帮助。 isEmpty 应该为哪些值返回 true?检查“”意味着它应该只在值为类型字符串且长度为 0 时返回 true。这里的许多答案假设它也应该为部分或所有错误值返回 true。 str.length > -1 我完全同意@RobG,这个问题定义不好。为什么你会认为null
或undefined
是空的?空字符串是空字符串,它不是null
或undefined
【参考方案1】:
如果你只是想检查是否有truthy value,你可以这样做:
if (strValue)
//do something
如果您需要专门检查空字符串是否超过 null,我认为检查 ""
是最好的选择,使用 the ===
operator(这样您就知道它实际上是一个字符串)比较)。
if (strValue === "")
//...
【讨论】:
测试长度属性实际上可能比针对 "" 测试字符串更快,因为解释器不必从字符串文字创建 String 对象。 @Vincent 在 Chrome 开发人员工具中进行了一些简单的分析,测试=== ''
与 .length
并没有显示出任何明显的改进(并且使用 .length
只有在你可以假设你有一个字符串)
@bdukes 当您开始关心这种微优化时,我不认为 Chrome 是您遇到大部分性能问题的浏览器...
请注意,如果您对“空字符串”的定义包括空格,则此解决方案不合适。一个包含 1 个或多个空格的字符串在上面返回 true。如果您使用的是 JQuery,您可以简单地使用: if ($.trim(ref).length === 0) - 根据类似问题的答案:***.com/questions/2031085/…
正如预期的那样,.length > 0
实际上比与字符串文字相比快得多!看看这个jsPerf【参考方案2】:
我不会太担心最高效的方法。使用对您的意图最清楚的内容。对我来说,这通常是strVar == ""
。
根据Constantin 的评论,如果 strVar 最终会包含一个整数 0 值,那么这确实是那些意图澄清的情况之一。
【讨论】:
坏主意。如果 strVar 被意外分配为 0,你会得到正确的结果。 我同意明确你的意图比其他方法可能产生的任何微优化更重要,但使用 strict comparison operator===
会更好。仅当strVar
为空字符串时才返回true。
如果未定义则检查失败。所以 if(str) 效果更好
@ValentinHeinitz 如果 str 被分配了一个虚假值 0 或“0”,if(str) 将错误地报告 true。最好的方法是 if(str === "")。这很简单,而且永远不会失败。
Which equals operator (== vs ===) should be used in JavaScript comparisons?【参考方案3】:
var s; // undefined
var s = ""; // ""
s.length // 0
在 JavaScript 中没有任何东西代表空字符串。检查length
(如果您知道var 始终是字符串)或""
【讨论】:
这句话我看不懂:There's nothing representing an empty string in JavaScript.
。 ""
呢,那不是代表空字符串吗?【参考方案4】:
你能得到的最接近str.Empty
(前提是str是一个字符串)是:
if (!str.length) ...
【讨论】:
str 为 null 会不会抛出异常? @PicMickael 是的!str.Empty
也是如此。
请注意,字符串不是唯一具有length
属性的变量类型。数组也可以。【参考方案5】:
如果您需要确保字符串不只是一堆空格(我假设这是用于表单验证),您需要对空格进行替换。
if(str.replace(/\s/g,"") == "")
【讨论】:
但是如果你真正想要测试的是一个包含非空格内容的字符串,那么它就可以完成这项工作。有没有更便宜的方法来测试这个? 长度属性怎么样? 与其删除所有空格,不如直接检查是否有非空格?有两个优点,如果有非空格字符,它可以提前退出,并且它没有返回一个新的字符串,你可以检查它。if(str.match(/\S/g))
@Mark FYI,你不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)
也许/\S/.test(str)
比str.match(/\S/)
更好,因为它不需要返回一组匹配的结果(可能是那里的微观性能提升)。此外,当仅针对正则表达式测试字符串时,请使用 RegExp .test()
方法更好地传达该意图。【参考方案6】:
我通常使用类似的东西:
if (str == "")
//Do Something
else
//Do Something Else
【讨论】:
==
运算符不严格。所以如果str == ""
、str
可以是null
、undefined
、false
、0
、[]
等。【参考方案7】:
你也可以使用正则表达式:
if((/^\s*$/).test(str))
检查是否为空字符串或由空格填充的字符串。
【讨论】:
它可以工作,但在操作方面也非常昂贵。如果您只想检查一两件事,而不是一大堆,那就太好了。【参考方案8】:我用:
function empty(e)
switch (e)
case "":
case 0:
case "0":
case null:
case false:
case typeof(e) == "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 的情况下工作。 我会走得更远一点,并为未定义的情况使用 === 运算符来确定它。否则,这只是一个完美的答案。typeof
中的 switch
对我不起作用。我添加了一个if (typeof e == "undefined")
测试并且有效。为什么?
@Lucas 因为这是一个错字或疏忽。您的修改是正确的方法。 (原文指的是空函数的上下文,不是e参数,这是函数应该检查的)
我们可以用case undefined:
代替case typeof(e) == "undefined":
吗?【参考方案9】:
为了检查一个变量是否为falsey 或者它的长度属性是否等于零(对于字符串,这意味着它是空的),我使用:
function isEmpty(str)
return (!str || str.length === 0 );
(请注意,字符串不是唯一具有length
属性的变量,例如,数组也有它们。)
为了检查变量是否为假或者字符串是否只包含空格或为空,我使用:
function isBlank(str)
return (!str || /^\s*$/.test(str));
如果你愿意,你可以像这样monkey-patchString
原型:
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)
不是真正可读的-也许使用更简单的代码或正则表达式删除空格会更好?见***.com/questions/6623231/… 和***.com/questions/10800355/…
/^\s*$/.test(str) 可以替换为 str.trim().length === 0
@Vincent 这也称为“尤达条件”,如if blue is the sky
。见dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html【参考方案10】:
试试这个
str.value.length == 0
【讨论】:
"".value.length
会导致错误。应该是str.length === 0
如果str
等于undefined
或null
,则抛出TypeError
【参考方案11】:
function tell()
var pass = document.getElementById('pasword').value;
var plen = pass.length;
// Now you can check if your string is empty as like
if(plen==0)
alert('empty');
else
alert('you entered something');
<input type='text' id='pasword' />
这也是一种检查字段是否为空的通用方法。
【讨论】:
【参考方案12】:前面的所有答案都很好,但这会更好。使用双重 NOT 运算符 (!!
):
if (!!str)
// Some code here
或者使用类型转换:
if (Boolean(str))
// Code here
两者的功能相同。将变量类型转换为布尔值,其中str
是一个变量。
它为null
、undefined
、0
、000
、""
、false
返回false
。
它为空字符串以外的所有字符串值返回true
(包括像"0"
和" "
这样的字符串)
【讨论】:
if(str)
和if(!!str)
的行为有区别吗?
@PeterOlson 如果您尝试将变量保存为检查多个字符串的内容的布尔值,那么您会想要这样做.. 又名var any = (!!str1 && !!str2 && !!str3)
处理如果那里也有数字
这是我一直使用的解决方案。 !!str.trim()
确保字符串不是仅由空格组成的。
看起来不像是 hack,Boolean(str)
可读性更强,“wtfish”更少。
这在if
中根本没用,它将虚假值转换为false
,将真实值转换为true
。 if
块是否执行取决于表达式是否真实,添加 !!
没有意义【参考方案13】:
我使用组合,最快的检查是第一个。
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 年见!【参考方案14】:忽略空白字符串,您可以使用它来检查 null、空和未定义:
var obj = ;
(!!obj.str) // Returns false
obj.str = "";
(!!obj.str) // Returns false
obj.str = null;
(!!obj.str) // Returns false
它很简洁,适用于未定义的属性,尽管它不是最易读的。
【讨论】:
你在这里检查真实性,这比仅仅检查空字符串要复杂一点,undefined
或 null
【参考方案15】:
我没有注意到考虑到字符串中可能存在空字符的答案。例如,如果我们有一个空字符串:
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 开发人员确实使用后端数据库,这可能会传递不同类型的“空”值。它应该在每个开发人员的脑海中。【参考方案16】:检查您是否没有尝试传递未定义的术语也是一个好主意。
function TestMe()
if((typeof str != 'undefined') && str)
alert(str);
;
TestMe();
var str = 'hello';
TestMe();
当对象实例的字符串属性不为空时,我通常会遇到想要做某事的情况。这很好,只是该属性并不总是存在。
【讨论】:
【参考方案17】:试试:
if (str && str.trim().length)
//...
【讨论】:
str.trim().length
会比str.trim()
快,根据我自己的测试结果大约快 1%。
OP 正在寻找空字符串、未定义或 null 的测试。这是测试不是任何这些条件的字符串。他也没有说任何关于空白字符串的事情。只要您确定变量中没有存储其他数据类型,您就可以测试 OP 的条件:if (!str) ...
【参考方案18】:
另一种方式,但我认为bdukes's answer 是最好的。
var myString = 'hello';
if(myString.charAt(0))
alert('no empty');
alert('empty');
【讨论】:
【参考方案19】:所有这些答案都很好。
但我不能确定变量是字符串,不只包含空格(这对我很重要),并且可以包含“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 无关。【参考方案20】:
我对如果将非字符串和非空/空值传递给测试器函数会发生什么进行了一些研究。众所周知,(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) 检查中。您还可以通过将 C# 行为添加到 String 来模仿,如下所示:
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; ]
];
【讨论】:
如果你只是停止使用==而使用===,那么如果(s === "")这样就解决了问题。【参考方案21】:此外,如果您认为填充了空格的字符串为“空”。
你可以用这个正则表达式来测试它:
!/\S/.test(string); // Returns true if blank.
【讨论】:
【参考方案22】:我更喜欢使用非空白测试而不是空白
function isNotBlank(str)
return (str && /^\s*$/.test(str));
【讨论】:
将否定放入函数名称是一个坏主意。你的代码本身很好,但函数应该被称为 hasValue() 之类的东西。为什么?当你看到这样的代码时会发生什么:“if (!isNotBlank(str))”......目前还不清楚意图应该是什么。对于这个简单的示例,它可能看起来与您无关,但在函数名称中添加否定总是一个坏主意。 IsNotBlank 是一个标准函数,是 StringUtils 中非常流行的函数commons.apache.org/proper/commons-lang/apidocs/org/apache/… 它还提供了 IsBlank 以避免双重否定。我相信函数名称应该反映它们执行的功能,并且当开发人员在同一个类中看到 isBlank 和 IsNotBlank 函数时,他们会更容易理解。【参考方案23】:不要假设你检查的变量是一个字符串。不要假设如果这个 var 有长度,那么它就是一个字符串。
问题是:仔细考虑您的应用必须做什么以及可以接受什么。构建强大的东西。
如果你的方法/函数应该只处理一个非空字符串,那么测试参数是否是一个非空字符串并且不要做一些“技巧”。
举个例子,如果你不小心听从这里的一些建议就会爆炸。
var getLastChar = function (str)
if (str.length > 0)
return str.charAt(str.length - 1)
getLastChar('hello')
=> "o"
getLastChar([0,1,2,3])
=> TypeError: Object [object Array] has no method 'charAt'
所以,我会坚持
if (myVar === '')
...
【讨论】:
这个答案应该置顶。【参考方案24】:我通常使用这样的东西,
if (!str.length)
// Do something
【讨论】:
如果您知道变量是字符串,则最快。如果变量未定义,则引发错误。 @AdrianHope-Bailie 为什么要测试未定义的变量? @AbimaelMartell 为什么不呢?您有一个变量,要么是您声明的,要么是从您无法控制的某个范围传递给您的,例如来自方法或 API 调用的响应。您可以假设它包含一个值并使用上面的检查,但如果它未定义或为空,您将收到错误。变种测试=空; if(!test.length)alert("adrian 错了"); OP 询问“如何检查空字符串”,未定义的变量不是空字符串。无论如何,您可以在检查是否为空之前检查typeof variable != "undefined"
。【参考方案25】:
非常通用的“一体化”功能(不推荐):
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。检查长度属性会导致字符串原语被包装在字符串对象中。【参考方案26】:
var x =" ";
var patt = /^\s*$/g;
isBlank = patt.test(x);
alert(isBlank); // Is it blank or not??
x = x.replace(/\s*/g, ""); // Another way of replacing blanks with ""
if (x==="")
alert("ya it is blank")
【讨论】:
【参考方案27】:您也应该始终检查类型,因为 JavaScript 是一种鸭子类型语言,因此您可能不知道数据在处理过程中何时以及如何更改。所以,这是更好的解决方案:
let undefinedStr;
if (!undefinedStr)
console.log("String is undefined");
let emptyStr = "";
if (!emptyStr)
console.log("String is empty");
let nullStr = null;
if (!nullStr)
console.log("String is null");
【讨论】:
第一个条件适用于任何虚假值,而不仅仅是undefined
。此答案不检查类型。【参考方案28】:
检查是否为空:
var str = "Hello World!";
if(str === '')alert("THE string str is EMPTY");
检查它是否是字符串类型:
var str = "Hello World!";
if(typeof(str) === 'string')alert("This is a String");
【讨论】:
错了。length
不是 null
。 str = ''; str.length == 0
不是 str.length == null
。但总的来说你的方法还可以。
检查长度属性将导致字符串原语被包装在字符串对象中,并且检查 null 也不正确,因为它不查找未定义(这不是一回事)。要测试空字符串,只需对照 "" 进行检查(即 if(myString === ""))【参考方案29】:
如果需要检测空字符串和空字符串,我将添加到 Goral 的答案中:
function isEmpty(s)
return !s.length;
function isBlank(s)
return isEmpty(s.trim());
【讨论】:
【参考方案30】:-
检查
var a;
是否存在
去掉值中的false spaces
,然后测试emptiness
if ((a)&&(a.trim()!=''))
// if variable a is not empty do this
【讨论】:
字符串" "
不为空,但在这种情况下会被认为是空的。以上是关于如何在 JavaScript 中检查空/未定义/空字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何在颤振发布方法中修复“未处理的异常:用于空值的空检查运算符”
如何在 jquery 数据表中找到空表或未找到匹配项时添加自定义警告消息