如果变量为“某物”,如何简化该测试?

时间:2018-06-27 08:44:58

标签: javascript node.js if-statement

在节点中,我想测试我赋予函数的变量是否为“某物”。我的意思不是一个null值,一个empy数组或一个空对象。因此,我编写了以下代码,该代码可以正常工作:

function f(v) {
    if (v === null) {
        return false;
    }
    if (v.constructor === Array) {
        if (v.length) {
            return true;
        } else {
            return false;
        }
    }
    if (v.constructor === Object) {
        if (Object.keys(v).length) {
            return true;
        } else {
            return false;
        }
    }
}

f(null);  // false
f([]);  // false
f({}); // false
f([1]); // true
f({a: 1}); // true

这似乎太冗长了。我认为有一种更简单的方法可以做到这一点。这是一个选项,但可读性较差,我认为仍然太冗长:

function f(v) {
    if (v === null) {
        return false;
    }
    if (v.constructor === Array) {
        return !!v.length;
    }
    if (v.constructor === Object) {
        return !!Object.keys(v).length;
    }
}

我希望可以将其减少到一个。知道我将如何做到吗?

2 个答案:

答案 0 :(得分:8)

您只能将一个条件用作v && Object.keys(v).length。它适用于ArrayObjectStringnullundefined类型。

function f(v){
  v && Object.keys(v).length? console.log('true'): console.log('false');
}
f(null);  // Should be false
f([]);  // Should be false
f({}); // Should be false
f([1]); // Should be true
f({a: 1}); // Should be true
f(''); // Should be false
f('somename'); // Should be true

答案 1 :(得分:3)

您可以返回对象检查的布尔值。

function f(o) {
    return Boolean(o && typeof o === 'object' && Object.keys(o).length);
}

console.log(f(null));     // false
console.log(f([]));       // false
console.log(f({}));       // false
console.log(f([1]));      // true
console.log(f({ a: 1 })); // true

相关问题