如何在JavaScript中检查空值?
JavaScript没有内置的方法来检查一个值是否为空,但是很容易创建一个方法来实现。然而,在我们开始之前,我们应该定义这个方法的行为。这个方法的灵感来自于Rails的blank?
方法,但是修改以适应JavaScript的需求。
首先,任何假值都应该被视为空。这些包括null
、undefined
、0
、false
、''
和NaN
。
const isFalsy = value => !value;
isFalsy(null); // true
isFalsy(undefined); // true
isFalsy(0); // true
isFalsy(false); // true
isFalsy(''); // true
isFalsy(NaN); // true
其次,空数组和空对象也应该被视为空。可以使用Object.keys()
来轻松检查这两种类型的值。
const isEmptyCollection = value =>
(Array.isArray(value) || value === Object(value)) &&
!Object.keys(value).length;
isEmptyCollection([]); // true
isEmptyCollection({}); // true
除了空字符串(''
)之外,只包含空格的字符串也应该被视为空。可以使用正则表达式来检查这一点。
const isWhitespaceString = value =>
typeof value === 'string' && /^\s*$/.test(value);
```js
isWhitespaceString(' '); // true
isWhitespaceString('\t\n\r'); // true
最后,我们可以检查一些常用的内置对象。无效的 Date
实例以及空的 Set
和 Map
实例都应该被视为空白。
const isInvalidDate = value =>
value instanceof Date && Number.isNaN(value.getTime());
const isEmptySet = value => value instanceof Set && value.size === 0;
const isEmptyMap = value => value instanceof Map && value.size === 0;
isInvalidDate(new Date('hello')); // true
isEmptySet(new Set()); // true
isEmptyMap(new Map()); // true
将所有内容放在一起,我们最终可以设置我们的 isBlank
方法。
const isFalsy = value => !value;
const isWhitespaceString = value =>
typeof value === 'string' && /^\s*$/.test(value);
const isEmptyCollection = value =>
(Array.isArray(value) || value === Object(value)) &&
!Object.keys(value).length;
const isInvalidDate = value =>
value instanceof Date && Number.isNaN(value.getTime());
const isEmptySet = value => value instanceof Set && value.size === 0;
const isEmptyMap = value => value instanceof Map && value.size === 0;
const isBlank = value => {
if (isFalsy(value)) return true;
if (isWhitespaceString(value)) return true;
if (isEmptyCollection(value)) return true;
if (isInvalidDate(value)) return true;
if (isEmptySet(value)) return true;
if (isEmptyMap(value)) return true;
return false;
};
isBlank(null); // true
isBlank(undefined); // true
isBlank(0); // true
isBlank(false); // true
isBlank(''); // true
isBlank(' \r\n '); // true
isBlank(NaN); // true
isBlank([]); // true
isBlank({}); // true
isBlank(new Date('hello')); // true
isBlank(new Set()); // true
isBlank(new Map()); // true