我有一个用例,其中一个函数接收一个可以是各种类型的变量,包括一个数组或一个对象引用。
但我想忽略传递的任何变量,这些变量在通常的JavaScript意义上都是假的,而且我想将空数组[]
和空对象{}
视为假。
我可以立即看到有很多方法可以做到这一点,但我想知道什么是最有效的假设一个非常现代的JavaScript实现和只有没有框架的vanilla JavaScript。
显而易见的方法是检查它是一个数组还是一个对象,如果它是一个对象,则在数组和.length
的情况下检查Object.keys(x).length
。但考虑到其他一些已经错误的东西也是typeof
object
,并且空阵列似乎表现得不真实或假,取决于你如何检查,我打赌有些方法更有效,也可能更惯用。
以下内容应符合您的标准(尽管看起来很难看)。
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
这检查sth
是否真实:
if(sth && (typeof sth !== "object" || Object.keys(sth).length))
alert("passes");
我经常用这个。
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");}