if(user) will pass for empty Object/Array, but they are empty and should be rejected.
Also if(user) will fail for values like 0 or false which are totally valid values.
Using isEmpty() will take care of such values. Also, it makes code more readable.
Point to note is isEmpty(1) will return true as 1 is a primitive value and not a data structure and hence should return true.
This has been stated in Docs:
Checks if value is an empty object, collection, map, or set.
Also as per docs,
Objects are considered empty if they have no own enumerable string keyed properties.
So if you have an object which does not have non-enumerable properties, its considered as empty. In the below example, foo is a part of object o and is accessible using o.foo but since its non-enumerable, its considered as empty as even for..in would ignore it.
var o = Object.create(null);
Object.defineProperty(o, "foo", {
enumerable: false,
value: "Hello World"
})
Object.defineProperty(o, "bar", {
enumerable: false,
value: "Testing 123"
});
console.log(o)
for (var k in o) {
console.log(k)
}
console.log(o.foo)
console.log(_.isEmpty(o))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Note: This does not mean you should use lodash for such purpose. You can write your own isEmpty function.
Following is something that I use:
This will return true for following cases:
{},[],"",undefined,null, object in above snippet(no enumerable property)
function isEmpty(value){
return value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
}
Answer from Rajesh Dixit on Stack Overflowif(user) will pass for empty Object/Array, but they are empty and should be rejected.
Also if(user) will fail for values like 0 or false which are totally valid values.
Using isEmpty() will take care of such values. Also, it makes code more readable.
Point to note is isEmpty(1) will return true as 1 is a primitive value and not a data structure and hence should return true.
This has been stated in Docs:
Checks if value is an empty object, collection, map, or set.
Also as per docs,
Objects are considered empty if they have no own enumerable string keyed properties.
So if you have an object which does not have non-enumerable properties, its considered as empty. In the below example, foo is a part of object o and is accessible using o.foo but since its non-enumerable, its considered as empty as even for..in would ignore it.
var o = Object.create(null);
Object.defineProperty(o, "foo", {
enumerable: false,
value: "Hello World"
})
Object.defineProperty(o, "bar", {
enumerable: false,
value: "Testing 123"
});
console.log(o)
for (var k in o) {
console.log(k)
}
console.log(o.foo)
console.log(_.isEmpty(o))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
Note: This does not mean you should use lodash for such purpose. You can write your own isEmpty function.
Following is something that I use:
This will return true for following cases:
{},[],"",undefined,null, object in above snippet(no enumerable property)
function isEmpty(value){
return value === undefined ||
value === null ||
(typeof value === "object" && Object.keys(value).length === 0) ||
(typeof value === "string" && value.trim().length === 0)
}
Simple and elegant function for checking the values are empty or not
function isEmpty(value) {
const type = typeof value;
if ((value !== null && type === 'object') || type === 'function') {
const props = Object.keys(value);
if (props.length === 0 || props.size === 0) {
return true;
}
}
return !value;
}
Testing the above method
It will return 'true' for all cases below
console.log(isEmtpy(null))
console.log(isEmtpy(0))
console.log(isEmtpy({}))
console.log(isEmtpy(new Set())
console.log(isEmtpy(Object.create(null))
console.log(isEmtpy(''))
console.log(isEmtpy(() => {}))
console.log(isEmtpy(() => [])
I wrongly assumed that (as name suggest) _.isEmpty checks if variable is somehow empty, like undefined, null, empty string, array etc. But I just noticed that _.isEmpty(123) will return true, same as _.isEmpty(true) or _.isEmpty(false).
Documentation explains why:
A value is considered empty unless it is an arguments object, array, string, or jQuery-like collection with a length greater than 0 or an object with own enumerable properties.
» npm install lodash.isempty
If you want to use isEmpty() to check for objects with nothing but falsey values, you can compose a function that uses values() and compact() to build an array of values from the object:
const isEmptyObject = _.flow(_.values, _.compact, _.isEmpty);
isEmptyObject({});
// -> true
isEmptyObject({ name: '' });
// -> true
isEmptyObject({ name: 0 });
// -> true
isEmptyObject({ name: '...' });
// -> false
_.some(obj, function (value) { return value === "" })
You can use this, it will return true if there is any empty property and false if all are defined.