问:
我看到了 this question,但没有看到 JavaScript 特定示例。 JavaScript 中有一个简单的 string.Empty,还是只是检查 “” 的一种情况?
答1:
huntsbot.com – 高效赚钱,自由工作
如果您只想检查是否有 truthy value,您可以执行以下操作:
if (strValue) {
//do something
}
如果您需要专门检查空字符串是否为空,我认为检查 “” 是您最好的选择,使用 the === operator (这样您就知道它实际上是您要比较的字符串) .
if (strValue === "") {
//...
}
测试长度属性实际上可能比针对 "" 测试字符串更快,因为解释器不必从字符串文字创建 String 对象。
@Vincent 在 Chrome 开发人员工具中进行了一些简单的分析,测试 === '' 与 .length 并没有显示出任何明显的改进(并且只有在您可以假设您有一个字符串的情况下使用 .length 才有效)
@bdukes 当您开始关心这种微优化时,我不认为 Chrome 是您遇到大部分性能问题的浏览器......
请注意,如果您对“空字符串”的定义包括空格,则此解决方案不合适。一个包含 1 个或多个空格的字符串在上面返回 true。如果您使用的是 JQuery,您可以简单地使用: if ($.trim(ref).length === 0) - 根据类似问题的答案:stackoverflow.com/questions/2031085/…
正如预期的那样,.length > 0 实际上比与字符串文字相比快得多!看看这个jsPerf
答2:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
为了检查变量是否为 falsey 或者它的长度属性是否等于零(对于字符串,这意味着它是空的),我使用:
function isEmpty(str) {
return (!str || str.length === 0 );
}
(请注意,字符串不是唯一具有 length 属性的变量,例如,数组也有它们。)
或者,您可以使用(不是这样)新的可选链接和箭头函数来简化:
const isEmpty = (str) => (!str?.length);
它将检查长度,如果为空值,则返回 undefined,而不会引发错误。在空值的情况下,零是假的,结果仍然有效。
为了检查变量是否为假或字符串是否仅包含空格或为空,我使用:
function isBlank(str) {
return (!str || /^\s*$/.test(str));
}
如果需要,您可以像这样monkey-patch 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());
请注意,猴子修补内置类型是有争议的,因为无论出于何种原因,它都可能破坏依赖于内置类型现有结构的代码。
为什么 0 === str.length 而不是 str.length === 0 ?
@Vincent 条件通常写成这样 if (variable == constant value) 并且如果您忘记了“=”,那么您将常量值分配给变量而不是测试。该代码仍然可以工作,因为您可以在 if 中分配变量。所以写这个条件更安全的方法是把常量值和变量取反。这样,当你测试你的代码时,你会看到一个错误(Invalid lef-hand side in assignment)。您还可以使用 JSHint 之类的东西来禁止在条件中赋值,并在编写时收到警告。
/^\s*$/.test(str) 可以替换为 str.trim().length === 0
@Vincent 这也称为“尤达条件”,如 if blue is the sky。请参阅dodgycoder.net/2011/11/yoda-conditions-pokemon-exception.html
虽然扩展原生原型并不是一个好主意,但通常认为这是一种不好的做法,很多人只是建议不要完全这样做,因为有更安全的方法同样好。关于主题 here 有一个 SO 讨论,但我读过的每一本 JS 编程书籍都强烈反对它。对于 OPs 问题,我通常只做 if (!str) { // i am sure str is empty null or undefined here if I'm sure it won't be another data type }
答3:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
以前的所有答案都很好,但这会更好。使用双重 NOT 运算符 (!!):
if (!!str) {
// Some code here
}
或使用类型转换:
if (Boolean(str)) {
// Code here
}
两者都执行相同的功能。将变量类型转换为布尔值,其中 str 是一个变量。
对于 null、未定义、0、000、“”、false,它返回 false。
它对除空字符串以外的所有字符串值返回 true(包括“0”和“”等字符串)
if(str) 和 if(!!str) 的行为有什么区别吗?
@PeterOlson,如果您尝试将变量保存为检查多个字符串的内容的布尔值,那么您会想要这样做.. aka var any = (!!str1 && !!str2 && !!str3) 处理如果那里也有数字
这是我一直使用的解决方案。 !!str.trim() 以确保字符串不是仅由空格组成的。
看起来不像是 hack,Boolean(str) 可读性更高,“wtfish”更少。
这在 if 中根本没用,它将虚假值转换为 false,将真实值转换为 true。 if 块是否执行取决于表达式是否为真,添加 !! 没有意义
答4:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
您可以得到的最接近 str.Empty 的东西(前提是 str 是一个字符串)是:
if (!str.length) { ...
那不会抛出异常是str为null吗?
@PicMickael 是的! str.Empty 也是如此。
请注意,字符串不是唯一具有 length 属性的变量类型。数组也可以。
答5:
huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。
如果您需要确保字符串不仅仅是一堆空格(我假设这是用于表单验证),您需要对空格进行替换。
if(str.replace(/\s/g,"") == ""){
}
但是,如果您真正想要测试的是具有非空格内容的字符串,那么这项工作就可以完成。有没有更便宜的方法来测试这个?
长度属性如何?
与其删除所有空格,不如只检查是否有非空格?有两个优点,如果有非空格字符,它可以提前退出,并且它没有返回一个新的字符串,然后你检查它。 if(str.match(/\S/g)){}
@Mark FYI,您不需要全局修饰符,因为第一次出现非空格字符的匹配意味着字符串不为空:str.match(/\S/)
或许 /\S/.test(str) 比 str.match(/\S/) 更好,因为它不需要返回一组匹配的结果(可能是那里的微性能增益)。此外,当仅针对正则表达式测试字符串时,请使用 RegExp .test() 方法更好地传达该意图。
答6:
huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!
我用:
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
huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感
此解决方案与语言无关。它唯一依赖的 JavaScript 特性是 typeof。因此,当您不信任不同浏览器中的实现并且没有时间获取更好的解决方案时,这是一个很好的解决方案示例。 (IE,无法访问互联网)。这有点像证明。不是最干净的,但你可以确定它会在不了解 JavaScript 的情况下工作。
对于未定义的情况,我会更进一步,并使用 === 运算符来确定它。否则,这只是一个完美的答案。
switch 中的 typeof 对我不起作用。我添加了一个 if (typeof e == "undefined") 测试并且有效。为什么?
@Lucas因为这是一个错字或疏忽。您的修改是正确的方法。 (原文指的是空函数的上下文,而不是e参数,这是函数应该检查的)
case typeof(e) == "undefined": 错误;匹配 false 的 e,而不是 undefined。显然这是一个获得批准的suggested edit。原来的 case typeof this == "undefined": 仍然没有任何意义。也没有理由将 false、0 和 "0" 视为“空”。
答7:
打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!
表现
我在 macOS v10.13.6 (High Sierra) 上针对 18 个选定的解决方案进行了测试。解决方案的工作方式略有不同(对于极端情况输入数据),如下面的片段中所示。
结论
基于 !str,,= 和 length 的简单解决方案适用于所有浏览器(A、B、C、G、I、J)
基于正则表达式 (test,replace) 和 charAt 的解决方案对于所有浏览器 (H,L,M,P) 来说都是最慢的
标记为最快的解决方案仅在一次测试运行中最快 - 但在许多运行中它会在“快速”解决方案组内发生变化
https://i.stack.imgur.com/bFeGV.png
细节
在下面的片段中,我通过使用不同的输入参数比较了选择的 18 种方法的结果
“” “a” " " - 空字符串、带字母的字符串和带空格的字符串
[] {} f- 数组、对象和函数
1 NaN 无穷大 - 数字
true false - 布尔值
空未定义
并非所有经过测试的方法都支持所有输入案例。
函数 A(str) { 让 r=1;如果 (!str) r=0;返回 r; } 函数 B(str) { 让 r=1;如果 (str == “”) r=0;返回 r; } 函数 C(str) { 让 r=1;如果 (str === “”) r=0;返回 r; } 函数 D(str) { 让 r=1; if(!str || 0 === str.length) r=0;返回 r; } 函数 E(str) { 让 r=1; if(!str || /^\s*KaTeX parse error: Expected 'EOF', got '}' at position 24: …tr)) r=0;返回 r; }̲ 函数 F(str) { 让 …/).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’ || !str || str.length === 0 || str === “” || !/[^\s]/.test(str) || /^\ s*KaTeX parse error: Undefined control sequence: \s at position 29: …| str.replace(/\̲s̲/g,"") === "") …{s}: ${f(“”)} ${f(“a”)} ${f(" “)} ${f([ ])} ${f({})} ${f(0)} ${f(1)} ${f(NaN)} ${f(Infinity)} ${f(f)} ${f( true)} ${f(false)} ${f(null)} f ( u n d e f i n e d ) ‘ ) ; 让 l o g 2 = ( s , f ) = > c o n s o l e . l o g ( ‘ {f(undefined)}`);让 log2 = (s,f)=> console.log(` f(undefined)‘);让log2=(s,f)=>console.log(‘{s}: ${f(”“)} ${f(“a”)} ${f(” “)} ${f([ ])} ${f({})} ${f(0)} ${f(1)} ${f(NaN)} ${f(Infinity)} ${f(f)} ${f(真)} f ( 假 ) ‘ ) ; 让 l o g 3 = ( s , f ) = > c o n s o l e . l o g ( ‘ {f(假)}`);让 log3 = (s,f)=> console.log(` 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(‘我’, 我); 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 = “” - 您可以在您的机器上运行测试here
https://i.stack.imgur.com/IxaPG.png
有点误导,因为它结合了修剪解决方案和无修剪解决方案。
答8:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
您可以使用 lodash:_.isEmpty(value)。
它涵盖了很多情况,如 {}、‘’、null、undefined 等。
但它总是为 Number 类型的 JavaScript primitive data types 返回 true,如 _.isEmpty(10) 或 _.isEmpty(Number.MAX_VALUE) 都返回 true。
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
_.isEmpty(" "); // => false
@Erich 因为 " " 不为空。 _.isEmpty(""); 返回真。
非常正确 - 我提到这一点是因为这里的一些其他答案暗示表单验证和检查字符串是否仅包含空格,而这个单一的 lodash 函数本身并不能解决这个问题。
答9:
与HuntsBot一起,探索全球自由职业机会–huntsbot.com
非常通用的“一体化”功能(虽然不推荐):
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))
);
}
但是,我不建议使用它,因为您的目标变量应该是特定类型(即字符串、数字或对象?),因此请应用与该变量相关的检查。
你有机会解释每张支票的作用吗? :)
-1 他们正在测试不同的东西。将它们全部放在一个 if 语句中是没有意义的。
typeof MyVariable == 'undefined' 不区分具有未定义值的已初始化变量和未声明变量,除非该变量最初已声明并初始化为 null。检查长度属性会导致字符串原语被包装在字符串对象中。
答10:
huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。
var s; // undefined
var s = ""; // ""
s.length // 0
JavaScript 中没有任何内容代表空字符串。对 length(如果您知道 var 始终是字符串)或 “” 进行检查
我不明白这句话:There's nothing representing an empty string in JavaScript. 。 "" 怎么样,不代表一个空字符串吗?
答11:
HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com
尝试:
if (str && str.trim().length) {
//...
}
根据我自己的测试结果,str.trim().length 会比 str.trim() 快 1% 左右。
OP 正在寻找空字符串、未定义或 null 的测试。这是测试不是任何这些条件的字符串。他也没有说任何关于空白字符串的事情。只要您确定变量中没有存储其他数据类型,您就可以测试 OP 的条件:if (!str) { ... }
huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求