function makeMap (
str,
expectsLowerCase
) {
var map = Object.create(null);
var list = str.split(',');
for (var i = 0; i < list.length; i++) {
map[list[i]] = true;
}
return expectsLowerCase
? function (val) { return map[val.toLowerCase()]; }
: function (val) { return map[val]; }
}
5 做一個純函數(shù)的緩存
function cached (fn) {
var cache = Object.create(null);
return (function cachedFn (str) {
var hit = cache[str];
return hit || (cache[str] = fn(str))
})
}
6判斷兩個值都是相等
function looseEqual (a, b) {
//基礎(chǔ)類型
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
// 都是對象類型
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
// 都是數(shù)組,判斷長度相等并且用every遍歷判斷兩個數(shù)組對應(yīng)位置的值相等呢過
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
// 如果是Date類型,時間相等
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
// 其他情況,調(diào)用遞歸逐個判斷是否相等
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
// 都不是對象,轉(zhuǎn)換成字符串類型后判斷您是否相等
return String(a) === String(b)
} else {
return false
}
}
if (typeof Set !== 'undefined' && isNative(Set)) {
// use native Set when available.
_Set = Set;
} else {
// a non-standard Set polyfill that only works with primitive keys.
_Set = /*@__PURE__*/(function () {
function Set () {
this.set = Object.create(null);
}
Set.prototype.has = function has (key) {
return this.set[key] === true
};
Set.prototype.add = function add (key) {
this.set[key] = true;
};
Set.prototype.clear = function clear () {
this.set = Object.create(null);
};
return Set;
}());
}