- Published on
不定期的跟着lodash写代码
- Authors
- Name
- McDaddy(戣蓦)
isArrayLike
const isLength = require("./isLength");
/**
* 判断value是不是array-like
* 条件:
* 1. 不是一个function
* 2. 有length属性
* 3. length 大于等于0 且小于等于Number.MAX_SAFE_INTEGER
*
* isArrayLike([1, 2, 3])
* // => true
*
* isArrayLike(document.body.children)
* // => true
*
* isArrayLike('abc')
* // => true
*
* isArrayLike(Function)
* // => false
* @param {*} value
*/
function isArrayLike(value) {
return value != null && typeof value !== 'function' && isLength(value.length);
}
console.log(isArrayLike([])); // true
console.log(isArrayLike('abc')); // true
console.log(isArrayLike({})); // false
原来’abc’也是ArrayLike, 即使不是一个对象,也可以是ArrayLike
isEmpty
/**
* 用来检查一个对象/数组/map/set是不是空
* 当传入对象时,当这个对象没有自己的可枚举属性,那么就是空对象
*
* 所有array或者array-like的对象,只判断length是不是0
* map和set 只判断size是不是0
*
* 如果传进来数字, 不管是什么都是返回true
*
* @example
* isEmpty(null)
* // => true
*
* isEmpty(true)
* // => true
*
* isEmpty(1)
* // => true
*
* isEmpty([1, 2, 3])
* // => false
*
* isEmpty('abc')
* // => false
*
* isEmpty({ 'a': 1 })
* // => false
* @param {*} value
*/
function isEmpty(value) {
if (value == null) {
return false;
}
if (isArrayLike(value) &&
(Array.isArray(value) || typeof value === 'string' || typeof value.splice === 'function' || // isBuffer(value) isBuffer是判断是不是node的buffer
isArguments(value) )) {
return !value.length;
}
const tag = getTag(value);
if (tag === '[object Map]' || tag === '[object Set]') {
return !value.size;
}
if (isPrototype(value)) {
return !Object.keys(value).length // 不太明白
}
for (const key in value) {
if (Object.prototype.hasOwnProperty.call(value, key)) {
return false;
}
}
return true;
}
module.exports = isEmpty;
TODO
isEqual
flatMap
Remove