js常用的工具函数大汇总( 三 )

<= 0) {if (timer) {clearTimeout(timer);timer = null;}result = func.call(self, ...params);previous = now;} else if (!timer) {timer = setTimeout(() => {if (timer) {clearTimeout(timer);timer = null;}result = func.call(self, ...params);previous = +new Date();}, remaining);}return result;};};// 迭代数组/类数组/对象const each = function each(obj, callback) {if (typeof callback !== "function") callback = Function.prototype;let i = 0,len,item,keys,key;if (isArrayLike(obj)) {len = obj.length;for (; i < len; i++) {item = obj[i];if (callback.call(item, item, i) === false) break;}} else {keys = Object.keys(obj);if (typeof Symbol !== "undefined") keys = keys.concat(Object.getOwnPropertySymbols(obj));for (; i < keys.length; i++) {key = keys[i];item = obj[key];if (callback.call(item, item, key) === false) break;}}return obj;};// 数组和对象的深浅合并const merge = function merge() {let options,target = arguments[0] || {},i = 1,length = arguments.length,deep = false,treated = arguments[length - 1];Array.isArray(treated) && treated.treated ? length-- : (treated = [], treated.treated = true);if (typeof target === "boolean") {deep = target;target = arguments[i] || {};i++;}if (typeof target !== "object" && !isFunction(target)) target = {};for (; i < length; i++) {options = arguments[i];if (options == null) continue;if (treated.includes(options)) return options;treated.push(options);each(options, function (copy, name) {let copyIsArray = Array.isArray(copy),copyIsObject = isPlainObject(copy),src = target[name],clone = src;if (deep && copy && (copyIsArray || copyIsObject)) {if (copyIsArray && !Array.isArray(clone)) clone = [];if (copyIsObject && !isPlainObject(clone)) clone = {};target[name] = merge(deep, clone, copy, treated);} else if (copy !== undefined) {target[name] = copy;}});}return target;};// 数组和对象的深浅克隆const clone = function clone() {let target = arguments[0],deep = false,type,isArray,isObject,ctor,result,treated = arguments[arguments.length - 1];if (typeof target === "boolean") {if (arguments.length === 1) return target;deep = target;target = arguments[1];}if (!Array.isArray(treated) || !treated.treated) {treated = [];treated.treated = true;}if (treated.includes(target)) return target;treated.push(target);type = toType(target);isArray = isArrayLike(target);isObject = isPlainObject(target);if (target == null) return target;ctor = target.constructor;if (/^(regexp|date|error)$/i.test(type)) {if (type === 'error') target = target.message;return new ctor(target);}if (/^(function|generatorfunction)$/i.test(type)) {return function proxy(...params) {return target.call(this, ...params);};}if (!isArray && !isObject) return target;result = isArray ? [] : {};each(target, function (copy, name) {if (deep) {result[name] = clone(deep, copy, treated);return;}result[name] = copy;});return result;};/* 暴露API */let utils = {debounce,throttle,offset,css,toType,isFunction,isWindow,isPlainObject,isArrayLike,isEmptyObject,isNumeric,each,merge,clone};if (typeof window !== "undefined") window.utils = utils;if (typeof module === "object" && typeof module.exports === "object") module.exports = utils;})();
【js常用的工具函数大汇总】


推荐阅读