JavaScript中是否存在字符串.Empty,还是只是检查“”?
当前回答
表演
我在macOS v10.13.6(High Sierra)上对18个选定的解决方案进行测试。解决方案的工作方式略有不同(对于角盒输入数据),这在下面的代码段中给出。
结论
简单的解决方案基于!str,==,===和长度对于所有浏览器(A、B、C、G、I、J)都很快基于正则表达式(test、replace)和charAt的解决方案对于所有浏览器(H、L、M、P)来说都是最慢的标记为最快的解决方案仅在一次测试中最快,但在许多测试中,它在“快速”解决方案组中发生了变化
细节
在下面的片段中,我通过使用不同的输入参数来比较所选的18种方法的结果
“a”-空字符串、带字母的字符串和带空格的字符串〔〕{}f-数组、对象和函数0 1 NaN无限-数字true-false-布尔值空未定义
并非所有测试过的方法都支持所有输入案例。
函数A(str){设r=1;if(!str)r=0;返回r;}函数B(str){设r=1;如果(str==“”)r=0;返回r;}函数C(str){设r=1;如果(str==“”)r=0;返回r;}函数D(str){设r=1;如果(!str||0===str.length)r=0;返回r;}函数E(str){设r=1;if(!str||/^\s*$/.test(str))r=0;返回r;}函数F(str){设r=1;if(!布尔(str))r=0;返回r;}函数G(str){设r=1;if(!((typeof str!='undefined')&&str))r=0;返回r;}函数H(str){设r=1;if(!/\S/.test(str))r=0;返回r;}函数I(str){设r=1;if(!str.length)r=0;返回r;}函数J(str){设r=1;如果(字符串长度<=0)r=0;返回r;}函数K(str){设r=1;if(str.length==0||!str.trim())r=0;返回r;}函数L(str){设r=1;if(str.replace(/\s/g,“”)==“”)r=0;返回r;}函数M(str){设r=1;if((/^\s*$/).test(str))r=0;返回r;}函数N(str){设r=1;if(!str||!str.trim().length)r=0;返回r;}函数O(str){设r=1;if(!str||!str.trim())r=0;返回r;}函数P(str){设r=1;if(!str.charAt(0))r=0;返回r;}函数Q(str){设r=1;if(!str||(str.trim()==''))r=0;返回r;}函数R(str){设r=1;if(typeof str==“undefined”||!字符串||字符串长度==0||str==“”||!/[^\s]/.测试(str)||/^\s*$/.test(str)||str.replace(/\s/g,“”)==“”)r=0;返回r;}//---测试---console.log('“”“a”“[]{}0 1 NaN Infinity f true false null undefined');let log1=(s,f)=>console.log(`${s}:${f(“”)}${f(“a”)}$${f(”)}${f([])}${f({})}${f(0)}${f(1)}${f(NaN)}{f)}(无限)}{f(f)}${(真)}$4{f(假)}$3{f(空)}$1{f(未定义)}`);let log2=(s,f)=>console.log(`${s}:${f(“”)}${f“”)}${f”(“a”)}${f f(“)}${f([])}${f({})}$4{f(0)}$1{f(1)}$2{f(NaN)}$f(无限)}$3{f(f)}$6{f(真)}$5{f(假)}`);让log3=(s,f)=>console.log(`${s}:${f(“”)}${f“a”)}$${f(”)}`);log1('A',A);log1('B',B);log1('C',C);log1(‘D’,D);log1('E',E);log1('F',F);log1('G',G);log1('H',H);log2(‘I’,I);log2('J',J);log3('K',K);log3('L',L);log3(M’,M);log3('N',N);log3(‘O’,O);log3(‘P’,P);log3(‘Q’,Q);log3('R',R);
然后,对于所有方法,我都会对浏览器Chrome v78.0.0、Safari v13.0.4和Firefox v71.0.0执行速度测试用例str=“”-您可以在这里的机器上运行测试
其他回答
您可以验证以下方法并了解其区别。
var j=未定义;console.log((typeof j==“undefined”)?“真”:“假”);var j=空;console.log((j==null)?“真”:“假”);var j=“”;console.log((!j)?“真”:“假”);var j=“Hi”;console.log((!j)?“真”:“假”);
为了检查变量是否为false,或者它的长度属性是否等于零(对于字符串,这意味着它为空),我使用:
function isEmpty(str) {
return (!str || str.length === 0 );
}
(请注意,字符串不是唯一具有长度属性的变量,例如,数组也有它们。)
或者,您可以使用(并非如此)新可选的链接和箭头函数来简化:
const isEmpty = (str) => (!str?.length);
它将检查长度,如果为空值,则返回undefined,而不会抛出错误。在空值的情况下,零是错误的,结果仍然有效。
为了检查变量是否为false,或者字符串是否仅包含空格或为空,我使用:
function isBlank(str) {
return (!str || /^\s*$/.test(str));
}
如果需要,您可以像这样对String原型进行猴式修补:
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());
请注意,monkey修补内置类型是有争议的,因为无论出于什么原因,它都会破坏依赖于内置类型现有结构的代码。
Try:
if (str && str.trim().length) {
//...
}
空字符串,未定义,null。。。
检查真实值:
if (strValue) {
// strValue was non-empty string, true, 42, Infinity, [], ...
}
要检查错误值,请执行以下操作:
if (!strValue) {
// strValue was empty string, false, 0, null, undefined, ...
}
空字符串(仅限!)
要检查是否正好为空字符串,请使用==运算符与“”进行严格相等比较:
if (strValue === "") {
// strValue was empty string
}
要严格检查非空字符串,请使用!==操作员:
if (strValue !== "") {
// strValue was not an empty string
}
Undercore.js JavaScript库,http://underscorejs.org/,提供了一个非常有用的_.isEmpty()函数,用于检查空字符串和其他空对象。
参考:http://underscorejs.org/#isEmpty
isEmpty _.isEmpty(对象)如果可枚举对象不包含值(无可枚举的所有者属性),则返回true。对于字符串和类似数组的对象_.isEmpty检查长度属性是否为0。_.is空([1,2,3]);=>假_.isEmpty({});=>真
其他非常有用的Undercore.js函数包括:
http://underscorejs.org/#isNull_.isNull(对象)http://underscorejs.org/#isUndefined_.is未定义(值)http://underscorejs.org/#has_.有(对象,键)