我有一个用例,其中一个函数接收一个变量,该变量可以是各种类型的,包括数组或对象引用。
但我想忽略任何传入的变量,这些变量在通常的JavaScript意义上是假的,另外,我想把空数组[]
和空对象{}
视为也是假的。
我可以立即看到有很多方法可以做到这一点,但我想知道,假设有一个非常现代的JavaScript实现,并且只有普通的JavaScript,没有框架,那么什么才是最有效的。
最明显的方法是检查它是数组还是对象,如果是数组,则检查.length
,如果是对象,则检查Object.keys(x).length
。但考虑到其他一些已经是假的东西也是typeof
object
,而且空数组似乎表现得要么是真的,要么是假的,这取决于你如何检查,我敢打赌,有些方法更有效,也可能更惯用。
发布于 2017-12-25 21:17:38
下面的内容应该符合你的标准(尽管它看起来很丑陋)。
if (
sth && // normal JS coercion
(!Array.isArray(sth) || sth.length) && // falsify empty arrays
(Object.getPrototypeOf(sth) !== Object.prototype || Object.keys(sth).length) // falsify empty objects
)
alert("pass");
测试:
sth = []; // Don't Pass
sth = {}; // Don't Pass
sth = null; // Don't Pass
sth = false; // Don't Pass
sth = undefined; // Don't Pass
sth = ""; // Don't Pass
sth = [1]; // Pass
sth = { a: "" } // Pass
sth = new Date; // Pass
sth = "a"; // Pass
sth = function(){} // Pass
发布于 2017-12-25 20:57:55
这将检查sth
是否为真:
if(sth && (typeof sth !== "object" || Object.keys(sth).length))
alert("passes");
发布于 2017-12-27 10:45:18
我一直都在用这个。
function IsEmpty(val){
return (!val || val == "" || (typeof(val) === "object" && Object.keys(val).length == 0) || val === [] || val === null || val === undefined);
}
通过的示例
if(IsEmpty(false)){console.log("pass");}
if(IsEmpty("")){console.log("pass");}
if(IsEmpty([])){console.log("pass");}
if(IsEmpty({})){console.log("pass");}
if(IsEmpty(null)){console.log("pass");}
if(IsEmpty()){console.log("pass");}
失败的例子
if(IsEmpty(true)){console.log("fail");}
if(IsEmpty("not null")){console.log("fail");}
if(IsEmpty([1])){console.log("fail");}
if(IsEmpty({"a":1})){console.log("fail");}
//!IsEmpty means is not empty
if(!IsEmpty(false)){console.log("fail");}
if(!IsEmpty("")){console.log("fail");}
if(!IsEmpty([])){console.log("fail");}
if(!IsEmpty({})){console.log("fail");}
if(!IsEmpty()){console.log("fail");}
https://stackoverflow.com/questions/47968851
复制相似问题