检查JavaScript变量是假的还是空数组或对象的最有效方法是什么?

问题描述 投票:1回答:3

我有一个用例,其中一个函数接收一个可以是各种类型的变量,包括一个数组或一个对象引用。

但我想忽略传递的任何变量,这些变量在通常的JavaScript意义上都是假的,而且我想将空数组[]和空对象{}视为假。

我可以立即看到有很多方法可以做到这一点,但我想知道什么是最有效的假设一个非常现代的JavaScript实现和只有没有框架的vanilla JavaScript。

显而易见的方法是检查它是一个数组还是一个对象,如果它是一个对象,则在数组和.length的情况下检查Object.keys(x).length。但考虑到其他一些已经错误的东西也是typeof object,并且空阵列似乎表现得不真实或假,取决于你如何检查,我打赌有些方法更有效,也可能更惯用。

javascript arrays javascript-objects
3个回答
1
投票

以下内容应符合您的标准(尽管看起来很难看)。

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

0
投票

这检查sth是否真实:

 if(sth && (typeof sth !== "object" || Object.keys(sth).length))
   alert("passes");

0
投票

我经常用这个。

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");}
© www.soinside.com 2019 - 2024. All rights reserved.