Javascript 确定字符串是否为;“空的”;

Javascript 确定字符串是否为;“空的”;,javascript,regex,Javascript,Regex,我需要一个JavaScript函数来告诉我string对象是否为空。所谓“空”,我的意思是它不仅仅是空白字符。我写了这个原型: String.prototype.isEmpty = function() { return this.length === 0 || this === " " || this.test(/^\s*$/); } 这样行吗 有更高性能的版本吗?看起来您需要使用/^\s*$/.test(this)而不是this.test(/^\s*$/)。对于没有test()方法,除

我需要一个JavaScript函数来告诉我string对象是否为空。所谓“空”,我的意思是它不仅仅是空白字符。我写了这个原型:

String.prototype.isEmpty = function() {
  return this.length === 0 || this === " " || this.test(/^\s*$/);
}
这样行吗


有更高性能的版本吗?

看起来您需要使用
/^\s*$/.test(this)
而不是
this.test(/^\s*$/)
。对于没有
test()
方法,除非您使用的是实现此方法的JavaScript库

/^\s*$/.test(this)
已经足够了,但是如果前两个表达式中的任何一个计算结果为true,则前两个表达式将短路,而不必测试正则表达式。这应该相当有效

如上面的注释所述,您的
this==”
表达式的计算结果将始终为false。您可以删除此表达式,或者使用
=
,如果您希望使用大量字符串,而这些字符串只包含一个空格字符:

String.prototype.isEmpty = function() {
  return this.length === 0 || this == " " || /^\s*$/.test(this);
}
在255个字符中(不考虑代码大于255的Unicode字符),长度为1的字符串可能包含空格字符。考虑到长度大于1的字符串,可能性会更低。

使用

String.prototype.isEmpty = function() {  
  if (!this.match(/\S/)) {
    return ('enter some valid input.Empty space is not allowed');
  } else {
   return "correct input";
  }
}


alert("test 1:"+("    ".isEmpty()));
alert("test 2:"+("   \t ".isEmpty()));
alert("test 3:"+("  \n   ".isEmpty()));
alert("test 4:"+("hi".isEmpty()));
注:

\s将匹配空白字符:空格、制表符或换行符

\S将匹配非空白字符:除空格、制表符或新行以外的任何字符。 如果字符串中有一个字符不是空格、制表符或新行,那么它就不是空的。
因此,您只需搜索一个字符:\S

我摆弄了一些东西:

  • 我返回这个.length的倒数,对于0,它是
    真的
    ,对于所有其他的数字,它是
    假的
  • 我删除了对“”的检查。事实上,我没有看到太多,如果有任何情况下,一个单一的空间被输入,删除检查是平均更快
  • 像其他人一样翻转正则表达式字符串
String.prototype.isEmpty=function(){

返回!this.length | |/^\s*$/.test(this);


通常,使用
RegExp.prototype.test
检查模式匹配,而不编译匹配的返回数组(
String.prototype.match
)可能具有更好的性能。我会尝试,但还没有测试,比如:

function isEmpty() {

     var string = arguments[0] ;
     var EMPTY_STRING_PATTERN = /^\s*$/ , empty = false ;

     if( EMPTY_STRING_PATTERN.exec(string) === true ) empty = true ;

     return empty ;

}
另一方面,摆弄核心javascript对象的原型对象被认为是不好的做法

来自示例


测试在FF3.0.8,Safari 5.0.1,谷歌浏览器5.0.37 5.127,但在IE 8

中产生JS错误,这是因为<代码= >“代码> <代码>测试将始终是错误的,因为<代码> < <代码> >是<代码>字符串< /代码>对象,而不是本机字符串,因此,永远不会“严格等于”<代码>“。您如何考虑字符串<代码>”0??@Matthew:难道所有的原生字符串都是字符串对象吗?无论如何,我在firefox中测试了它:
String.prototype.foo=function(){return(this==“”)};“”.foo()
@slebetman:不完全是。在某些情况下,您可以假装它们是,因为
String.prototype
中的函数在字符串中可用。但是当您调用它们时,它相当于
新字符串。method()
。数字也是如此。您的
此===”
示例之所以有效,是因为您使用了
==
而不是
==
。在这种情况下,
将自动转换为本机字符串,因此它们相等。使用
==
,类型必须相同,并且此
类型始终是“object”。我使用Safari进行了检查,严格比较
字符串
对象与包含相同字符的常量字符串不会返回
TRUE
。检查
此长度是否严格等于0没有意义。这个.length的
是否有任何有效值可以等于0,而不是0?@kiamlaluno:你说得对。但一般来说,在可能的情况下使用严格的equals
==
被认为是许多JavaScript开发人员的最佳实践。我想这并没有什么害处。一般来说,至少在某种情况下使用
==
操作符可能会有害处。我想挑战一下这种可能性。为什么是1/255?首先,假设是255个字符,而实际上还有很多字符。接下来,假设每个字符的概率相同,就像随机选择一个一样。空格可能是文本块中最常见的字符,在OP的场景中,它作为一个字母可能非常常见。@Kobi:我没有提到概率。我不确定仅仅由空格组成的字符串是否是传递给JavaScript函数的最可能的字符串;如果JavaScript代码正在处理表单中用户插入的用户名,那么由单个空格组成的字符串可能是不太可能的输入。kiamlaluno所说的是忽略了原始海报对包含单个空格的字符串的显式测试。马克·托马斯:我是指那个;谢谢你澄清了我想说的话<代码>:-)
这不是一个好答案。您根本没有提到性能问题。您基本上提出了我的实现的一个更糟糕的版本(如果使用Mathew Crumley的反馈进行更正的话)。例如,使用正则表达式检查对象属性的长度是否会导致性能下降?
function isEmpty() {

     var string = arguments[0] ;
     var EMPTY_STRING_PATTERN = /^\s*$/ , empty = false ;

     if( EMPTY_STRING_PATTERN.exec(string) === true ) empty = true ;

     return empty ;

}
var orig="   foo  "
document.write(orig.trim())  // foo

document.write(orig.trim().length) // 3