'IsNullOrWhitespace' in JavaScript?

75

是否有JavaScript等同于.NET的String.IsNullOrWhitespace的方法,以便我可以检查客户端文本框中是否有任何可见文本?

我宁愿先在客户端执行此操作,而不是提交文本框值并仅依赖于服务器端验证,尽管我也会这样做。


4
不需要为此创建一个专门的函数,只需测试以下表达式:x.value.trim() === ''(其中 x 是指向输入元素的引用)。如果值只包含空白字符,则该表达式将返回 true,否则返回 false。为这样一个简单的任务创建一个专用函数会过度设计。请注意:对于 IE8 及以下版本,您需要实现 trim() 函数。这是一项非常简单的任务,而且这也是您想要执行的操作。 - Šime Vidas
5
文本框的值不能为 null,因此这只是一个检查的浪费。 - epascarello
4
“文本框的值不能为空”这个说法或许是正确的,但是其他无数个字符串却可以为空。我在一个日期选择器上使用了自定义knockout绑定,而它的值可以为空。 - Rhyous
8个回答

94

要实现一个简洁的现代跨浏览器方案,只需执行以下操作:

function isNullOrWhitespace( input ) {
  return !input || !input.trim();
}

这里是jsFiddle。下面有注释。


目前被接受的答案可以简化为:

function isNullOrWhitespace( input ) {
  return (typeof input === 'undefined' || input == null)
    || input.replace(/\s/g, '').length < 1;
}

并将虚假性进一步利用:

function isNullOrWhitespace( input ) {
  return !input || input.replace(/\s/g, '').length < 1;
}

trim()在所有最新的浏览器中都可用,因此我们可以选择放弃正则表达式:

function isNullOrWhitespace( input ) {
  return !input || input.trim().length < 1;
}

再加入一些虚假性质,得到最终(简化)版本:

function isNullOrWhitespace( input ) {
  return !input || !input.trim();
}

3
如果输入不是一个字符串,这段代码可能会出现 Uncaught TypeError: input.trim is not a function - JustinStolle

90

自己编写并不难:roll your own

function isNullOrWhitespace( input ) {

    if (typeof input === 'undefined' || input == null) return true;

    return input.replace(/\s/g, '').length < 1;
}

1
已更新以支持未定义。在进入此方法之前,您的其他测试用例失败了@Rhyous。 - Dexter
你的解决方案非常好,也许你可以在条件语句中添加 if (!input) return true; 以使代码更简洁 @Dexter - ccordon
@Dexter,代码在这里的更改后运行得非常好,这是一个示例 - ccordon
4
为什么要使用正则表达式而不是 trim() 函数? - Kyle Delaney
1
这篇文章发布于2011年,在trim()成为规范的一部分之前 - 但是现在你可以使用trim()了!(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/String/trim) - Dexter
显示剩余5条评论

3

不可以,但你可以写一个

function isNullOrWhitespace( str )
{
  // Does the string not contain at least 1 non-whitespace character?
  return !/\S/.test( str );
}

如果是 typeof(str) == 'string' ? str : '',则返回 !/\S/.test(typeof(str) == 'string' ? str : '')。否则,null、undefined 或任何对象都将返回 true。 - user578895
1
我会将其写成!str || !/\S/.test(str); - Neil
@cwolves,你用什么浏览器,HTMLInputElement.value 会返回 null?只是因为问题提问者认为“null”是可能的值,并不意味着它实际上就是。 - Peter Bailey
1
没有,但是你正在编写一个通用函数,它可以在另一个上下文中使用 :) - user578895
1
@cwolves,我猜我们对函数名称中的“null”有不同的理解。 我认为它是“空字符串”,而不是实际的null值。http://en.wikipedia.org/wiki/Empty_string - Peter Bailey
1
这对于空值和未定义的值都失败了:http://plnkr.co/edit/zWruFu?p=preview - Rhyous

2

试试这个

检查字符串是否未定义、为空、不是字符串类型,或者只包含空格

/**
  * Checks the string if undefined, null, not typeof string, empty or space(s)
  * @param {any} str string to be evaluated
  * @returns {boolean} the evaluated result
*/
function isStringNullOrWhiteSpace(str) {
    return str === undefined || str === null
                             || typeof str !== 'string'
                             || str.match(/^ *$/) !== null;
}

你可以像这样使用它
isStringNullOrWhiteSpace('Your String');

0

您可以使用正则表达式/\S/来测试字段是否为空格,并将其与空值检查相结合。

例如:

if(textBoxVal === null || textBoxVal.match(/\S/)){
    // field is invalid (empty or spaces)
}

这个不检查空值。 - Shivanshu Goyal
如果textBoxVal为null,则您的条件语句的第一部分将抛出异常。您需要先判断textBoxVal === null。 - kybernetikos

0

trim() 是一个 JS 缺失的有用字符串函数.

添加它:

String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g,"") }

那么:if (document.form.field.value.trim() == "")


String.prototype.trim 是自 JavaScript v5.1 / 2011年6月起的一部分。 - Johannes Buchholz

0

你必须编写自己的代码:

function isNullOrWhitespace(strToCheck) {
    var whitespaceChars = "\s";
    return (strToCheck === null || whitespaceChars.indexOf(strToCheck) != -1);
}

这种技术仅适用于空字符串,如"",而不适用于包含多个空格字符的字符串。 - Randy Burden

0
从两个最佳答案中提取相关部分,您可以得到类似以下的内容:
function IsNullOrWhitespace(input) {
    if (typeof input === 'undefined' || input == null) return true;
    return !/\S/.test(input); // Does it fail to find a non-whitespace character?
}

以下内容仅适用于对此答案与Dexter答案之间性能差异感兴趣的人。两者都会产生相同的结果,但这段代码稍微快一些。

在我的电脑上,使用QUnit测试以下代码:

var count = 100000;
var start = performance.now();
var str = "This is a test string.";
for (var i = 0; i < count; ++i) {
    IsNullOrWhitespace(null);
    IsNullOrWhitespace(str);
}
var end = performance.now();
var elapsed = end - start;
assert.ok(true, "" + count + " runs of IsNullOrWhitespace() took: " + elapsed + " milliseconds.");

结果如下:

  • RegExp.replace 方法 = 33 - 37 毫秒
  • RegExp.test 方法 = 11 - 14 毫秒

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接