diff --git "a/docs/zjw/\345\211\215\347\253\257\345\270\270\350\247\201\346\211\213\345\206\231\344\273\243\347\240\201.md" "b/docs/zjw/\345\211\215\347\253\257\345\270\270\350\247\201\346\211\213\345\206\231\344\273\243\347\240\201.md" index 46ffa66..21fc0ec 100644 --- "a/docs/zjw/\345\211\215\347\253\257\345\270\270\350\247\201\346\211\213\345\206\231\344\273\243\347\240\201.md" +++ "b/docs/zjw/\345\211\215\347\253\257\345\270\270\350\247\201\346\211\213\345\206\231\344\273\243\347\240\201.md" @@ -22,6 +22,32 @@ const debounceTask = debounce(task, 1000); window.addEventListener('scroll', debounceTask); ``` +首次立即执行 + +```js +function debounce(fn, delay) { + var timer = null; + + return function () { + clearTimeout(timer); + + const f = fn.bind(this, ...arguments); + const callNow = !timer; + + if (callNow) { + f(); + } + timer = setTimeout(() => { + timer = null; + // 非首次调用 + if (!callNow) { + f(); + } + }, delay); + }; +} +``` + ## 节流 用于限制函数执行频率 @@ -77,6 +103,30 @@ function deepClone(obj) { } ``` +### stringify 方法实现 + +```js +function stringify(obj) { + if (obj === null || typeof obj !== 'object') { + // 数组 undefined 会被转换成 null + return obj === undefined || obj === null ? 'null' : obj; + } + if (Array.isArray(obj)) { + return '[' + json.map((m) => stringify(m)).join(',') + ']'; + } + + return ( + '{' + + Object.keys(obj) + // 过滤值为 undefined 的 key + .filter((key) => obj[key] !== undefined) + .map((key) => `"${key}":${stringify(obj[key])}`) + .join(',') + + '}' + ); +} +``` + ## 继承 ### ES5 继承