我有一个名为isEmpty
的函数。这是它的样子:
/**
* Returns true when the argument is empty.
*
* We define empty as:
* - undefined
* - null
* - a string with length 0
* - an array with length 0
* - an object with no parameters: consider this?
**/
function isEmpty(arg) {
return (arg === null) ||
(arg === undefined) ||
((typeof (arg) === 'string') ? arg.length === 0 : false) ||
((Array.isArray(arg)) ? arg.length === 0 : false);
}
我想知道,当一个对象没有参数({}
)时,返回true会有用吗?
答案 0 :(得分:2)
根据您的用例,如果对象内部没有键值对,则可以说对象为空。由于数组也是一个对象,您只需检查typeof arg === 'object'
,然后检查Object.keys()
获得的密钥数组的长度。对于空字符串,您只需将arg与""进行比较即可。像这样:
function isEmpty(arg) {
return (arg === null) ||
(arg === undefined) ||
(arg === "") ||
((typeof arg === 'object') ? Object.keys(arg).length === 0 : false);
}
console.log(isEmpty(null));
console.log(isEmpty(undefined));
console.log(isEmpty([]));
console.log(isEmpty({}));
console.log(isEmpty(1));

答案 1 :(得分:1)
如果对象具有enumerable properties(或for...of可迭代对象),则可以推广它。
function isEmpty(arg) {
for (e in arg) return false;
return true;
}
console.log(isEmpty(null), isEmpty(undefined))
console.log(isEmpty(""), isEmpty([]), isEmpty({}))
console.log(isEmpty(0)) // doesn't work for Number, Boolean, Set, Map, etc.
console.log(isEmpty("0"), isEmpty([0]), isEmpty({0:0}))
答案 2 :(得分:1)
答案是否。它返回false,例如。 {}
和{age:67}
。
如果要使用Object.getOwnPropertyNames()
方法检查对象是否没有参数。它比for in
循环或keys()
方法更安全,因为它检查对象是否只有自己定义的属性(无论其原型属性如何)。
var a = {};
var b = {name:'Paul'};
console.log(isObjectEmpty(a)); //true
console.log(isObjectEmpty(b)); //false
function isObjectEmpty(obj){
return !Object.getOwnPropertyNames(obj).length;
}
如果您想保留您的功能,可以使用
function isEmpty(arg) {
if(arg === null || typeof arg==='undefined') return true;
if(typeof arg==='string') return !arg.length;
if(arg.constructor.name==='Array') return !arg.length;
if(arg.constructor.name==='Object') return !Object.getOwnPropertyNames(arg).length;
}