Javascript 确定字符串是否为;“空的”;
我需要一个JavaScript函数来告诉我string对象是否为空。所谓“空”,我的意思是它不仅仅是空白字符。我写了这个原型: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()方法,除
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