我需要一个JavaScript函数来告诉我一个字符串对象是否为空。所谓“空”,我的意思是它不仅仅是空白字符。我写了这个原型:
String.prototype.isEmpty = function() { return this.length === 0 || this === " " || this.test(/^\s*$/); }
这样可以吗?有没有性能更好的版本?
zazmityj1#
用途
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
bgibtngc2#
看起来您需要使用/^\s*$/.test(this)而不是this.test(/^\s*$/)。strings没有test()方法,除非您使用实现此方法的JavaScript库。/^\s*$/.test(this)已经足够了,但是如果前两个表达式中的任何一个计算为true,那么前两个表达式就会短路,而不必测试正则表达式,这应该是非常有效的。正如@Matthew Crumley在上面的注解中所指出的,您的this === " "表达式将始终计算为false。您可以删除此表达式,或者如果您希望有许多字符串只有一个空格字符,则使用==:
/^\s*$/.test(this)
this.test(/^\s*$/)
test()
this === " "
==
String.prototype.isEmpty = function() { return this.length === 0 || this == " " || /^\s*$/.test(this); }
rryofs0p3#
String.prototype.isEmpty = function() { return this.length == 0 || /^\s*$/.test(this); }
在255种可能性中(不考虑代码大于255的Unicode字符),长度为1的字符串包含空格字符,考虑长度大于1的字符串,这种可能性甚至更低。
z18hc3ub4#
通常,使用RegExp.prototype.test检查模式匹配而不编译匹配的返回数组(String.prototype.match)可能会有更好的性能。
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对象的prototype对象被认为是不好的做法。
disbfnqx5#
来自示例https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim
var orig=" foo " document.write(orig.trim()) // foo document.write(orig.trim().length) // 3
在FF 3.6.8、Safari 5.0.1、谷歌浏览器5.0.375.127上测试,但在IE 8上产生js错误
lp0sw83n6#
我摆弄了一些东西:
true
false
" "
String.prototype.isEmpty = function() {return !this.length || /^\s*$/.test(this);}
String.prototype.isEmpty = function() {
return !this.length || /^\s*$/.test(this);
}
bttbmeg07#
答案与最初以示例形式提供的Daniel Vassallo相同。
String.prototype.isEmpty = function() { return /^\s*$/.test(this); }
document.body.style="background-color:black; color:green;font-size:12pt;font-family: 'Courier New', monospace;font-weight: bold"; String.prototype.isEmpty = function() { return /^\s*$/.test(this); } let test0 = ''.isEmpty(); let test1 = '\xa0'.isEmpty(); let test2 = ' '.isEmpty(); let test3 = '\t'.isEmpty(); let test4 = '\n'.isEmpty(); let test5 = '\n\n'.isEmpty(); let test6 = '\n\t\n'.isEmpty(); let test7 = '\r\n'.isEmpty(); let test8 = '\r\t\n'.isEmpty(); let test9 = '\r\n\t'.isEmpty(); var texts = new Array( ("String.prototype.isEmpty = function() {"), (" return /^\s*$/.test(this);"), ("}"), (""), ("let test0 = ''.isEmpty() // " + test1), ("let test1 = ' '.isEmpty() // " + test2) + " (non breaking space)", ("let test2 = ' '.isEmpty() // " + test2), ("let test3 = '\\t'.isEmpty() // " + test3), ("let test4 = '\\n'.isEmpty() // " + test4), ("let test5 = '\\n\\n'.isEmpty() // " + test5), ("let test6 = '\\n\\t\\n'.isEmpty() // " + test6), ("let test7 = '\\r\\n'.isEmpty() // " + test7), ("let test8 = '\\r\\t\\n'.isEmpty() // " + test8), ("let test9 = '\\r\\n\\t'.isEmpty() // " + test9) ); texts.forEach(text => { let nobreakchar = '\xa0' ; document.body.append(document.createTextNode(text.replaceAll(" ",nobreakchar))) document.body.append(document.createElement("br")) });
62lalag48#
不要写太多的行,让我们只用2行就完成了。
String.prototype.isEmpty = function () { return this.length === 0 || this.trim() === "" }
使用trim(),您不必担心变量是否只有空格字符,这也是您如何避免落入regex的原因
8条答案
按热度按时间zazmityj1#
用途
注:
\s将匹配空白字符:空格、制表符或换行符。
\S将匹配非空白字符:除空格、制表符或换行符以外的任何字符。如果字符串中有一个非空格、制表符或换行符的字符,则该字符串不为空。因此,您只需搜索一个字符:\S
bgibtngc2#
看起来您需要使用
/^\s*$/.test(this)
而不是this.test(/^\s*$/)
。strings没有test()
方法,除非您使用实现此方法的JavaScript库。/^\s*$/.test(this)
已经足够了,但是如果前两个表达式中的任何一个计算为true,那么前两个表达式就会短路,而不必测试正则表达式,这应该是非常有效的。正如@Matthew Crumley在上面的注解中所指出的,您的
this === " "
表达式将始终计算为false。您可以删除此表达式,或者如果您希望有许多字符串只有一个空格字符,则使用==
:rryofs0p3#
在255种可能性中(不考虑代码大于255的Unicode字符),长度为1的字符串包含空格字符,考虑长度大于1的字符串,这种可能性甚至更低。
z18hc3ub4#
通常,使用
RegExp.prototype.test
检查模式匹配而不编译匹配的返回数组(String.prototype.match
)可能会有更好的性能。顺便说一句,摆弄核心javascript对象的prototype对象被认为是不好的做法。
disbfnqx5#
来自示例https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/Trim
在FF 3.6.8、Safari 5.0.1、谷歌浏览器5.0.375.127上测试,但在IE 8上产生js错误
lp0sw83n6#
我摆弄了一些东西:
true
,对于所有其他的数字是false
。" "
的检查。实际上我还没有看到太多,如果任何情况下,一个单一的空间被输入,删除检查是海事组织的平均速度更快。String.prototype.isEmpty = function() {
return !this.length || /^\s*$/.test(this);
}
bttbmeg07#
答案与最初以示例形式提供的Daniel Vassallo相同。
62lalag48#
不要写太多的行,让我们只用2行就完成了。
使用trim(),您不必担心变量是否只有空格字符,这也是您如何避免落入regex的原因