该函数(“isEmpty”)是否应检查Object是否没有参数?

时间:2017-09-03 02:42:41

标签: javascript function

我有一个名为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会有用吗?

3 个答案:

答案 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;
}