{"_id":"0216tool_xiaoye","_rev":"3-cd21f2fe1a0552cb953fde9cf41eb14f","name":"0216tool_xiaoye","dist-tags":{"latest":"1.2.0"},"versions":{"1.0.0":{"name":"0216tool_xiaoye","version":"1.0.0","main":"dist/yeyongjie.js","description":"叶永洁自定义工具函数库","keywords":["atguigu","utils","array","object","function","promise","axios"],"license":"MIT","scripts":{"build":"webpack"},"devDependencies":{"webpack":"^5.10.0","webpack-cli":"^4.2.0"},"gitHead":"5d17d40ebf33cb3d629427c13bd9c365ba3b9f29","_id":"0216tool_xiaoye@1.0.0","_nodeVersion":"14.4.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-SsQgLvOHUYuuz6a9famvzZKO7KbVCGKKpya+CQ9Qyv2X6c/SLNd+w7M/QZTEYaDYW8d7OvPuvVNvSj+I96jtCw==","shasum":"5ba06c0bb16543eb50c462b40fc7cac10c216523","tarball":"https://registry.npmjs.org/0216tool_xiaoye/-/0216tool_xiaoye-1.0.0.tgz","fileCount":14,"unpackedSize":31219,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJfz3zNCRA9TVsSAnZWagAAR1QQAIKXem98qc6EuDrXWKog\nHV4ffR2QbB+ZsF6EgLaveB74HoDM/wOa6YrMxFX2XcbDTq6nPg68jaR0BThm\nNdnI5wFwNK7okNWqS7zKvzSDNxmqcmVR3E6WqcZ+zsJKPUehc5eWC9OFrT3l\nMJbdIA/YvbmSO4F55ODZ52aOk9RF9K24LSbxa9ccve8Fc/eIX0IH6Gy8gLrQ\nN217hT+m8NPj9/1gTuBwKBuZQcTf3izdReUgiRD474q8d9xoi16obv3xr7E6\n2mEKRPlJRk93yCEFlqtJeS6vmqYQXRUulBz50oz5sRk++bAcYHXAzeEChlY9\nZPVAiBrzuTSQZjS9IiDurNihid9lTwXvs1wEGYJcXHI0lskem2j/vxV7aeWn\nUbSD6L6zowIdmI6+5sCuwlblA4mge2d3AXrf8W6n/nKXSlP0lvqKSYdTxPKm\nx9NJkZOij5czhRsssh65vqk0ITTiuW31wAnlkt15Aau/KsEnevjsTsSBi6tK\nHFLA6Ln9fuwUx0oQ6QDW521bjDa7D6VcyIxyWv0T1rUmbvGMfisOaOYdIK4Z\ngRdSezkXCznY8LMUQZLlVWLcJYGrd6uEzy5lWwBydEcCCtGw+w7F107l8+o4\nZwepUQEP3DssyTWrTjvH87KEgSYucgNWj+JaTzczMPCzCpIAp28Tbl0jRyLk\nclJy\r\n=8Txf\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGIgYEus4ci8SsIsLFHfMwdEkkOoInNQKh5DB/YZ1A8ZAiBUx1IZ1+pomnzFuCTkV4znZxrkb0U4NfxS54WXpz9ftw=="}]},"_npmUser":{"name":"0216ye","email":"2246106715@qq.com"},"directories":{},"maintainers":[{"name":"0216ye","email":"2246106715@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/0216tool_xiaoye_1.0.0_1607433421023_0.7956571391523288"},"_hasShrinkwrap":false},"1.1.0":{"name":"0216tool_xiaoye","version":"1.1.0","main":"dist/yeyongjie.js","description":"叶永洁自定义工具函数库","keywords":["atguigu","utils","array","object","function","promise","axios"],"license":"MIT","scripts":{"build":"webpack --watch"},"devDependencies":{"webpack":"^5.10.0","webpack-cli":"^4.2.0"},"gitHead":"b6cb78a176b55b66b8e8aa0e33a63752000b158f","_id":"0216tool_xiaoye@1.1.0","_nodeVersion":"14.4.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-vmqaRqsAFUzELCq3DtM6UtbbdHt/cpqAsT8PY/FXAoA9v9mYqm128kCwZ9gP5SlcypVUH/ViEQcPIVnkJGVb0g==","shasum":"47ca2c2ee07868ed4d255bf2ba4319971a29d870","tarball":"https://registry.npmjs.org/0216tool_xiaoye/-/0216tool_xiaoye-1.1.0.tgz","fileCount":22,"unpackedSize":54302,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf0NDaCRA9TVsSAnZWagAAZj0P/iX6+LLk4Y+EiUd8wKBy\nrjEjbgjXq64XGWoOrYYgsnpx1ZcxGIZsGZOKYZiqlbv09H1vYrK8PMrK7p1E\nj1totlkY72QNSRA3XSLrWYrt0+GbLd15lQyVqXF8BSw4dNelDaarDNrJcoXR\nSb+Gst/Tb0W5hkWwdZu4oYFWYyiB9n381N4Dzb9yqlEUvODT7oDHnnGhJ7nA\ngbgHXsCxrDYdX8Lrr/sKxbTGH320Wk/ST1E/z+0Ifz5g/JXzaPwfvpEl/e35\nWy1hqH+c9+dOf8llltKTihUWvXoj7nqYOZQMkA2v+fYL1gpcaBu7ci/t5+yo\nuE0yUxkZT5vHQSTxfyFqfMTrMca+tjOu622IWhJJvgN06LgzHCsNdL2UgK8H\nlwBbZqmSKMlj8GTW0BcJWpG8WzeWp8lKTtF6VwtjutVq+qtEj47ZlOCPWFpg\nKUL+zcFze5Gc6JLsUUxiPN4gtw9+WX0AIE/ZDvr8kQ5oft6hFfySt0KfkgDH\nASJadF8esGrLBC7eYjem2fODSruZrfgbSCLQtYBFdUz0hO7EVfYWhJ2aripr\nW6cwPYc8XehuZ692cIYhtHRtfeB3i5gfWzpQTL9xlSllYNFelljLqJQf2tFg\njKI1Qw6nh/03z0vfEdxeAE5Lw6AVO6P73vX4pMk97KzZyng9SJOHIGgOOqiD\naSLn\r\n=GvQY\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFc2yYyjLo01U/fpkL/v5KAM9SgLX+WCK3ceg+ijv9jhAiEAj735Jquxkfkvkaozo4w40XjhYJVqCuFBKI+TVZO2uSQ="}]},"_npmUser":{"name":"0216ye","email":"2246106715@qq.com"},"directories":{},"maintainers":[{"name":"0216ye","email":"2246106715@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/0216tool_xiaoye_1.1.0_1607520473737_0.43804128991656777"},"_hasShrinkwrap":false},"1.2.0":{"name":"0216tool_xiaoye","version":"1.2.0","main":"dist/yeyongjie.js","description":"叶永洁自定义工具函数库","keywords":["atguigu","utils","array","object","function","promise","axios"],"license":"MIT","scripts":{"build":"webpack --watch"},"devDependencies":{"webpack":"^5.10.0","webpack-cli":"^4.2.0"},"gitHead":"8179c49671fe79cd224ccd1e1d7fa60e9244cc90","_id":"0216tool_xiaoye@1.2.0","_nodeVersion":"14.4.0","_npmVersion":"6.14.5","dist":{"integrity":"sha512-+As5a5I9rrpX0P1nAcZke6KLZcM9tt4iuA9mHpj31PQ0pWGNyLaLpAfxha5aWbNxKqsr/P0kWFbas9RjFpb4Hw==","shasum":"e0c6a9eb973a9db4e03997a0a69d019be7ea6883","tarball":"https://registry.npmjs.org/0216tool_xiaoye/-/0216tool_xiaoye-1.2.0.tgz","fileCount":56,"unpackedSize":141514,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJf1JIUCRA9TVsSAnZWagAA1LcP/2qz9kddisB5DeHeFzyC\nj2m7lS1f2NG67/oZew6vkSbX84ri45EgjfrKVdp9IpWqe9AWSc5YjyRT50WN\nLyZvYdkWxbFwRHe3CRAnpsSuVygYJ85AHI6RyVCM+CtSjl0WB1gsHMPRzeRZ\nrfCnBFb0Lz6E8Ma5EN3he8ttVR5fKkIjXnjKxj0yG2fcty38RY/p17BPi4nI\nlMc/iRReRkC/GGPZj2OGQxURQTqAsCQZPBYvEC0w6F7NIBrEJvxM3ddibmI1\no84l5JDIuM4YIn0xk7zUQ/pqoLcyMJSEwXa+dSrSGepgUD+nN8l4chiPBRsG\n61AJmAMxUPiBBKR2xS10X7MkecvBXWu1Y3hFpTQy/PY+9b/bLCqZMnQQH7/k\nSziZkp/MqIIVB5VYbT7SVZOQzYPq1F9LcLh8qg5zYYN/WEnZMKpJwGoZOgZN\nTzDsYAaYNy4r6h4n6odNCl24kIWCRQXVgunrGg7xx7nwuYjgKnZMLo67WyNV\n5l5hZ7EvHABMoP+Z5p280AJThqYIz7hnnnVCtVrqdKygaZOnxccR5HbnijDG\n/bVM9NroT43TuK6PFQ8WBYoxDjmJRRxraKvQQgTkfY48PNdmSMV5n96TlmC8\n8oG7SpypOFGE3KT4spVbKYJ9H9YMVkOmRPPDg84SEbFxO+YGkspOM2xwzbKf\n4Qzx\r\n=71IC\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDgJtN0K/CI0Jabiv5jIyApkH2j04W1atK8hfOJYf1PeAIgRHCIXD6S69KCLacBMfDrZyVuTcXkImo1WYCVlFKgoKM="}]},"_npmUser":{"name":"0216ye","email":"2246106715@qq.com"},"directories":{},"maintainers":[{"name":"0216ye","email":"2246106715@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/0216tool_xiaoye_1.2.0_1607766547962_0.7367870569493118"},"_hasShrinkwrap":false}},"time":{"created":"2020-12-08T13:17:01.023Z","1.0.0":"2020-12-08T13:17:01.120Z","modified":"2022-04-04T10:06:45.830Z","1.1.0":"2020-12-09T13:27:53.858Z","1.2.0":"2020-12-12T09:49:08.243Z"},"maintainers":[{"name":"0216ye","email":"2246106715@qq.com"}],"description":"叶永洁自定义工具函数库","keywords":["atguigu","utils","array","object","function","promise","axios"],"license":"MIT","readme":"# 工具函数\n## 0. 工具函数库: lodash\n    1. 封装了各种类型数据简化操作的函数库\n        数组\n        对象\n        函数\n        字符串\n        类型判断\n        ...\n    2. 特点:\n        模块化\n        函数式 / 声明式\n\n## 1. 函数的call() / apply() / bind()\n    1. 区别call()/apply()/bind()\n        call(obj)/apply(obj): 调用函数, 指定函数中的this为第一个参数的值\n        bind(obj): \n            返回一个新的函数, 新函数内部会调用原来的函数, 且this为bind()指定的第一参数的值\n            一旦调用新函数, 原函数就会调用, 且tis是bind指定的第一个参数\n            如果直接调用原函数, this不是bind指定的第一个参数\n        注意: 如果obj是null/undefined, this为window\n    2. 应用\n        call()/apply()应用: 根据伪数组生成真数组\n        bind(): react中组件的自定义方法 / vue中的事件回调函数内部\n    3. 自定义call()/apply()\n        1). 给obj添加一个临时方法, 方法名任意, 值为当前函数\n        2). 通过obj调用这个临时方法, 并将接收的参数传入\n        3). 删除obj上的这个临时方法属性\n    4. 自定义实现bind()\n        1). 返回一个新函数\n        2). 在新函数内部通过原函数对象的call方法来执行原函数\n            指定原函数的this为obj\n            指定参数为bind调用的参数和后面新函数调用的参数\n\n## 2. 函数的节流(throttle)与防抖(debounce)\n    1. 事件频繁触发可能造成的问题?\n        1). 一些浏览器事件:window.onresize、window.mousemove等，触发的频率非常高，会造成浏览器性能问题\n        2). 如果向后台发送请求，频繁触发，对服务器造成不必要的压力\n    2. 如何限制事件处理函数频繁调用\n        1). 函数节流\n        2). 函数防抖\n    3. 函数节流(throttle)\n        1). 理解: \n            在函数需要频繁触发时: 函数执行一次后，只有大于设定的执行周期后才会执行第二次\n            适合多次事件按时间做平均分配触发\n        2). 场景：\n            窗口调整（resize）\n            页面滚动（scroll）\n            DOM 元素的拖拽功能实现（mousemove）\n            抢购疯狂点击（click）\n    4. 函数防抖(debounce)\n        1). 理解:\n            在函数需要频繁触发时: 在规定时间内，只让最后一次生效，前面的不生效。\n            适合多次事件一次响应的情况\n        2). 场景：\n            输入框实时搜索联想（keyup/input）\n\n## 3. 数组声明式系列方法\n    1. 区别命令式与声明式\n    2. 使用数组声明式系列方法\n        1). map()\n        2). reduce()\n        3). filter()\n        4). find()\n        5). findIndex()\n        6). every()\n        7). some()\n    3. 自定义数组声明式系列方法\n\n## 4. 数组去重(unique)\n    1. 理解: \n        根据当前数组产生一个去除重复元素后的新数组\n        如: [2, 3, 2, 7, 6, 7] ==> [2, 3, 7, 6]\n    2. 实现:\n        方法1: 利用forEach()和indexOf()\n               说明: 本质是双重遍历, 效率差些\n        方法2: 利用forEach() + 对象容器\n               说明: 只需一重遍历, 效率高些\n        方法3: 利用ES6语法: from + Set 或者 ... + Set\n               说明: 编码简洁\n\n## 5. 数组合并(concat)与切片(slice)\n    1. 合并concat()\n        语法: var new_array = concat(array, value1[, value2[, ...[, valueN]]]) \n        功能: 将n个数组或值与当前数组合并生成一个新数组, 原始数组不会被改变 \n    2. 切片slice()\n        语法: var new_array = slice(array, [begin[, end]])\n        功能: 返回一个由 begin 和 end 决定的原数组的浅拷贝, 原始数组不会被改变\n\n## 6. 数组扁平化(flatten)\n    1. 理解: \n        取出嵌套数组(多维)中的所有元素放到一个新数组(一维)中\n        如: [1, [3, [2, 4]]]  ==>  [1, 3, 2, 4]\n    2. 实现:\n        方法一: 递归 + reduce() + concat()\n        方法二: ... + some() + concat()\n\n## 7. 数组取真与分块\n    1. compact(array): 返回数组中所有真值元素组成的新数组\n    2. chunk(array, size): 将数组拆分成多个 size 长度的区块，每个区块组成小数组,整体组成一个二维数组\n\n## 8. 数组取差异与合并\n    1. difference(arr1, arr2)\n        得到当前数组中所有不在arr中的元素组成的数组(不改变原数组)\n        如: difference([1,3,5,7], [5, 8])  ==> [1, 3, 7]\n    2. mergeArray(arr1, arr2): \n        将arr2与arr1的元素进行合并组成一个新的数组(不改变原数组)\n        如: mergeArray([1,3,5,7], [5, 8]) ==> [1, 3, 5, 7, 8]\n\n## 9. 删除数组中部分元素\n    1. pull(array, ...values): \n        删除原数组中与value相同的元素, 返回所有删除元素的数组\n        说明: 原数组发生了改变\n        如: pull([1,3,5,3,7], 2, 7, 3, 7) ===> 原数组变为[1, 5], 返回值为[3,3,7]\n    2. pullAll(array, values): \n        功能与pull一致, 只是参数变为数组\n        如: pullAll([1,3,5,3,7], [2, 7, 3, 7]) ===> 数组1变为[1, 5], 返回值为[3,3,7] \n\n## 10. 得到数组的部分元素\n    1. drop(array, count): \n        得到当前数组过滤掉左边count个后剩余元素组成的数组\n        说明: 不改变当前数组, count默认是1\n        如: drop([1,3,5,7], 2) ===> [5, 7]\n    2. dropRight(array, count): \n        得到当前数组过滤掉右边count个后剩余元素组成的数组\n        说明: 不改变当前数组, count默认是1\n        如: dropRight([1,3,5,7], 2) ===> [1, 3]\n\n## 11. 自定义new和instanceof工具函数\n    1. 自定义new工具函数\n        语法: newInstance(Fn, ...args)\n        功能: 创建Fn构造函数的实例对象\n        实现: 创建空对象obj, 调用Fn指定this为obj, 返回obj\n    2. 自定义instanceof工具函数\n        语法: myInstanceOf(obj, Type)\n        功能: 判断obj是否是Type类型的实例\n        实现: Type的原型对象是否是obj的原型链上的某个对象, 如果是返回tru, 否则返回false\n\n## 12. 合并多个对象\n    语法: object mergeObject(...objs)\n    功能: 合并多个对象, 返回一个合并后对象(不改变原对象)\n\n## 13. 对象/数组拷贝\n    1. 区别浅拷贝与深拷贝\n        纯语言表达:\n            浅拷贝: 只是复制了对象属性或数组元素本身(只是引用地址值)\n            深拷贝: 不仅复制了对象属性或数组元素本身, 还复制了指向的对象(使用递归)\n        举例说明: persons拷贝\n            浅拷贝: 只是拷贝了每个person对象的引用地址值, 每个person对象只有一份\n            深拷贝: 每个person对象也被复制了一份新的\n    2. 实现浅拷贝\n        方法一: 利用ES6语法\n        方法二: 利用ES5语法\n    3. 实现深拷贝\n        1). 大众乞丐版\n            问题1: 函数属性会丢失\n            问题2: 循环引用会出错\n        2). 面试基础版本\n            解决问题1: 函数属性还没丢失\n        3). 面试加强版本\n            解决问题2: 循环引用正常\n        4). 面试加强版本2(优化遍历性能)\n            数组: while | for | forEach() 优于 for-in | keys()&forEach() \n            对象: for-in 与 keys()&forEach() 差不多\n\n## 14. 字符串处理的系列方法\n    1. 字符串倒序: reverseString(str)  生成一个倒序的字符串\n    2. 字符串是否是回文: palindrome(str) 如果给定的字符串是回文，则返回 true ；否则返回 false\n    3. 截取字符串: truncate(str, num) 如果字符串的长度超过了num, 截取前面num长度部分, 并以...结束\n\n## 15 手写继承\n    实现方式:  \n        寄生组合式\n            1.子类构造函数中使用call借用父类构造函数，得到与父类相同的属性\n            2.子类指定新的原型对象为父类，得到父类原型上的方法\n            3.寄生处理：\n                去除原型对象上多余的属性-->不直接new 父类构造函数\n                    通过指定一个函数的原型对象为父类的原型对象,然后直接new该函数\n    解决问题: \n        原型对象有不必要的属性\n        多调用了1次父类型构造函数\n    \n\n## 16. 手写事件总线: event-bus\n    1. EventBus: 包含所有功能的全局事件总线对象\n    2. EventBus.on(eventName, listener): 绑定事件监听\n    3. EventBus.emit(eventName, data): 分发事件\n    4. EventBus.off(eventName): 解绑事件监听\n\n## 17. 手写消息订阅与发布: pub-sub\n    1. PubSub: 包含所有功能的订阅/发布消息的管理者\n    1. PubSub.subscribe(msg, subscriber): 订阅消息: 指定消息名和订阅者回调函数\n    2. PubSub.publish(msg, data): 异步发布消息: 指定消息名和数据\n    3. PubSub.publishSync(msg, data): 同步发布消息: 指定消息名和数据\n    4. PubSub.unsubscribe(flag): 取消订阅: 根据标识取消某个或某些消息的订阅\n\n## 18. 手写Promise\n    1. 定义整体结构\n    2. Promise构造函数的实现\n    3. promise.then()/catch()的实现\n    4. Promise.resolve()/reject()的实现\n    5. Promise.all/race()的实现\n    6. Promise.resolveDelay()/rejectDelay()的实现\n\n## 19. 手写ajax请求函数: axios\n    1.函数的返回值为promise, 成功的结果为response, 失败的结果为error\n    2.能处理多种类型的请求: GET/POST/PUT/DELETE\n    3.函数的参数为一个配置对象\n      {\n        url: '',   // 请求地址\n        method: '',   // 请求方式GET/POST/PUT/DELETE\n        params: {},  // GET/DELETE请求的query参数\n        data: {}, // POST或DELETE请求的请求体参数 \n      }\n    4.响应json数据自动解析为js的对象/数组\n\n\n\n","readmeFilename":"README.md"}