string.Empty
的方法,或者只需要检查 ""
是否为空?string.Empty
的方法,或者只需要检查 ""
是否为空?要检查真实值:
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
}
=== ''
和.length
之间的区别并未显示出明显的改进(并且仅在您可以假设有一个字符串的情况下使用.length
才有效)。 - bdukes为了检查一个变量是否为假值或者它的长度属性是否等于零(对于字符串来说,意味着它是空的),我使用:
function isEmpty(str) {
return (!str || str.length === 0 );
}
请注意,字符串不是唯一具有length
属性的变量,数组也有这个属性,例如。
或者,您可以使用(不太)新的可选链和箭头函数来简化:
const isEmpty = (str) => (!str?.length);
它将检查长度,在空值的情况下返回undefined
,而不会抛出错误。在空值的情况下,零是假值,结果仍然有效。
要检查变量是否为假值,或者字符串是否只包含空格或为空,我使用:
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());
if (变量 == 常量值)
的形式,如果你忘了一个 '=',那么你就会把常量值赋给变量而不是测试它。尽管代码仍然可以工作,因为你可以在 if 语句中给变量赋值,但更安全的方式是反转常量值和变量的位置。这样当你测试代码时,你会看到一个错误(Invalid lef-hand side in assignment)。你还可以使用类似 JSHint 的工具来禁止在条件中赋值并在你编写这样的代码时得到警告。 - grandouassouif blue is the sky
。请参见 http://www.dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html - AZ.if (!str) { // 我确定str在这里是空的null或undefined,如果我确定它不是另一种数据类型 }
。 - Stephen M Irving所有之前的答案都很好,但这个方法会更好。使用双重 NOT 运算符 (!!
):
if (!!str) {
// Some code here
}
或者使用类型转换:
if (Boolean(str)) {
// Code here
}
两种方法都能实现相同的功能。将变量转换为布尔值,其中 str
是一个变量。
返回值为false
的情况有: null
, undefined
, 0
, 000
, ""
, 和 false
。
返回值为true
的情况是除空字符串外的所有字符串值(包括像 "0"
和 " "
这样的字符串)。
if(str)
和if(!!str)
的行为有区别吗? - Peter Olsonvar any = (!!str1 && !!str2 && !!str3)
如果其中还有数字的话,也需要进行处理。 - John Ruddell!!str.trim()
确保字符串不仅仅由空格组成。 - Dario OddeninoBoolean(str)
更易读且不那么令人困惑。 - shinzouif
语句中,这样做毫无意义,它将假值转换为 false
,将真值转换为 true
。if
块的执行取决于表达式是否为真值,因此添加 !!
没有任何意义。 - Oli Crt如果 str 是一个字符串,那么与 str.Empty
最接近的东西是:
if (!str.length) { ...
str.Empty
也是。 - Ates Goral如果您需要确保字符串不仅仅是一堆空格(我假设这是用于表单验证),则需要对空格进行替换。
if(str.replace(/\s/g,"") == ""){
}
if(str.match(/\S/g)) {}
。 - mpenstr.match(/\S/)
。 - neezer/\S/.test(str)
比 str.match(/\S/)
更好,因为它不需要返回匹配结果的数组(可能会有微小的性能提升)。此外,当只是针对正则表达式进行测试字符串时,使用 RegExp 的 .test()
方法可以更好地传达意图。 - Ates Goral我使用:
function empty(e) {
switch (e) {
case "":
case 0:
case "0":
case null:
case false:
case undefined:
return true;
default:
return false;
}
}
empty(null) // true
empty(0) // true
empty(7) // false
empty("") // true
empty((function() {
return ""
})) // false
switch
语句中的 typeof
对我不起作用。我添加了一个 if (typeof e == "undefined")
测试,然后它就能正常工作了。为什么? - Lucascase typeof(e) == "undefined":
是错误的;它匹配的是 false
的 e
,而不是 undefined
。显然这是一个被批准的 建议编辑。原始的 case typeof this == "undefined":
仍然没有任何意义。也没有理由认为 false
、0
和 "0"
是“空”的。 - Sebastian SimonisEmpty("0")
返回 true,这让我感到惊讶和不希望的行为。在Javascript中,"0"
在布尔上下文中被评估为true,因此我不希望它被认为是空的。 - Flimm我在macOS v10.13.6(High Sierra)上对18个选择的解决方案进行测试。这些解决方案在某些输入数据的情况下略有不同,如下代码片段所示。
结论
!str
、==
、===
和length
基础解决方案在所有浏览器(A、B、C、G、I、J)中均较快test
、replace
)和charAt
的解决方案在所有浏览器(H、L、M、P)中最慢在下面的代码片段中,我通过使用不同的输入参数比较选定的18种方法的结果
""
、"a"
、" "
- 空字符串、带有字母的字符串和带有空格的字符串[]
、{}
、f
- 数组、对象和函数0
、1
、NaN
、Infinity
- 数字true
、false
- 布尔值null
、undefined
并非所有测试过的方法都支持所有输入情况。
function A(str) {
let r=1;
if (!str)
r=0;
return r;
}
function B(str) {
let r=1;
if (str == "")
r=0;
return r;
}
function C(str) {
let r=1;
if (str === "")
r=0;
return r;
}
function D(str) {
let r=1;
if(!str || 0 === str.length)
r=0;
return r;
}
function E(str) {
let r=1;
if(!str || /^\s*$/.test(str))
r=0;
return r;
}
function F(str) {
let r=1;
if(!Boolean(str))
r=0;
return r;
}
function G(str) {
let r=1;
if(! ((typeof str != 'undefined') && str) )
r=0;
return r;
}
function H(str) {
let r=1;
if(!/\S/.test(str))
r=0;
return r;
}
function I(str) {
let r=1;
if (!str.length)
r=0;
return r;
}
function J(str) {
let r=1;
if(str.length <= 0)
r=0;
return r;
}
function K(str) {
let r=1;
if(str.length === 0 || !str.trim())
r=0;
return r;
}
function L(str) {
let r=1;
if ( str.replace(/\s/g,"") == "")
r=0;
return r;
}
function M(str) {
let r=1;
if((/^\s*$/).test(str))
r=0;
return r;
}
function N(str) {
let r=1;
if(!str || !str.trim().length)
r=0;
return r;
}
function O(str) {
let r=1;
if(!str || !str.trim())
r=0;
return r;
}
function P(str) {
let r=1;
if(!str.charAt(0))
r=0;
return r;
}
function Q(str) {
let r=1;
if(!str || (str.trim()==''))
r=0;
return r;
}
function R(str) {
let r=1;
if (typeof str == 'undefined' ||
!str ||
str.length === 0 ||
str === "" ||
!/[^\s]/.test(str) ||
/^\s*$/.test(str) ||
str.replace(/\s/g,"") === "")
r=0;
return r;
}
// --- TEST ---
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(Infinity)} ${f(f)} ${f(true)} ${f(false)} ${f(null)} ${f(undefined)}`);
let log2 = (s,f)=> console.log(`${s}: ${f("")} ${f("a")} ${f(" ")} ${f([])} ${f({})} ${f(0)} ${f(1)} ${f(NaN)} ${f(Infinity)} ${f(f)} ${f(true)} ${f(false)}`);
let 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);
我为所有方法执行速度测试案例str = ""
,浏览器包括 Chrome v78.0.0、Safari v13.0.4 和 Firefox v71.0.0 - 您可以在您的计算机上运行测试这里
你可以使用lodash:_.isEmpty(value)。
它涵盖了很多情况,比如{}
、''
、null
、undefined
等。
但是它对于JavaScript原始数据类型中的Number
类型总是返回true
,例如_.isEmpty(10)
或_.isEmpty(Number.MAX_VALUE)
都会返回true
。
_.isEmpty(" "); // => false
- Erich" "
不是空的。_.isEmpty("");
返回 true。 - Moshi非常通用的“全能”函数(不建议使用):
function is_empty(x)
{
return ( //don't put newline after return
(typeof x == 'undefined')
||
(x == null)
||
(x == false) //same as: !x
||
(x.length == 0)
||
(x == 0) // note this line, you might not need this.
||
(x == "")
||
(x.replace(/\s/g,"") == "")
||
(!/[^\s]/.test(x))
||
(/^\s*$/.test(x))
);
}
不过,我不建议使用这种方法,因为你的目标变量应该是特定类型的(例如字符串、数字或对象),所以应该应用与该变量相关的检查。
var s; // undefined
var s = ""; // ""
s.length // 0
在JavaScript中,没有用于表示空字符串的任何内容。如果您知道变量将始终是字符串,请使用length
进行检查,否则请使用""
进行检查。
""
不是代表空字符串吗? - Flimm
null
或undefined
是空的呢?一个空字符串就是一个空字符串,它不是null
或undefined
。 - Flimm