范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

12JavaScript高频速写题

  1. 防抖  // 防抖:可以和你的电脑设定了10分钟睡眠时间的场景结合起来理解 // 如果你一直在用电脑,那么电脑就不会睡眠(频繁的把前一个定时器关掉,开启新的定时器) // 当你最后一次没操作电脑10分钟之后,电脑陷入睡眠 const debounce = function (func, delay) {   let timer = null    return function (...args) {     clearTimeout(timer)      timer = setTimeout(() => {       func.apply(this, args)     }, delay)   } }  // 测试 // html部分  // js部分 const showName = debounce(function (name) {   console.log($input.value, this, name) }, 500)   $input.addEventListener("input", (e) => {   // 500ms内停止输入才会输出   showName.call({ name: "前端胖头鱼" }, "前端胖头鱼") }) 2. 节流
  节流:任凭你怎么触发,其在指定的时间间隔内只会触发一次   基于时间戳(方式1)const throttle = function (func, delay) {   let startTime = Date.now()    return function (...args) {     let lastTime = Date.now()      if (lastTime - startTime > delay) {       func.apply(this, args)       startTime = Date.now()     }   } }  // 测试 let t1 = Date.now()  const showName = throttle(function (name) {   const t2 = Date.now()   console.log(this, name, t2 - t1)   t1 = Date.now() }, 1000) // 虽然设置了每隔10毫秒就会执行一次showName函数, 但是实际还是会每隔1秒才输出 setInterval(() => {   showName.call({ name: "前端胖头鱼" }, "前端胖头鱼") }, 10)  // { name: "前端胖头鱼" } "前端胖头鱼" 1013 // { name: "前端胖头鱼" } "前端胖头鱼" 1001 // { name: "前端胖头鱼" } "前端胖头鱼" 1006 // { name: "前端胖头鱼" } "前端胖头鱼" 1006 // { name: "前端胖头鱼" } "前端胖头鱼" 1005 基于setTimeout(方式2)const throttle2 = function (func, delay) {   let timer = null    return function (...args) {     if (!timer) {       timer = setTimeout(() => {         func.apply(this, args)         timer = null       }, delay)      }   } } // 测试 let t1 = Date.now()  const showName = throttle2(function (name) {   const t2 = Date.now()   console.log(this, name, t2 - t1)   t1 = Date.now() }, 1000)  setInterval(() => {   showName.call({ name: "前端胖头鱼" }, "前端胖头鱼") }, 10)  // { name: "前端胖头鱼" } "前端胖头鱼" 1014 // { name: "前端胖头鱼" } "前端胖头鱼" 1001 // { name: "前端胖头鱼" } "前端胖头鱼" 1007 // { name: "前端胖头鱼" } "前端胖头鱼" 1011 // { name: "前端胖头鱼" } "前端胖头鱼" 1009 // { name: "前端胖头鱼" } "前端胖头鱼" 1008 3. 函数柯里化const curry = (func, ...args) => {   // 获取函数的参数个数   const fnLen = func.length    return function (...innerArgs) {     innerArgs = args.concat(innerArgs)     // 参数未搜集足的话,继续递归搜集     if (innerArgs.length < fnLen) {       return curry.call(this, func, ...innerArgs)     } else {       // 否则拿着搜集的参数调用func       func.apply(this, innerArgs)     }   } } // 测试 const add = curry((num1, num2, num3) => {   console.log(num1, num2, num3, num1 + num2 + num3) })  add(1)(2)(3) // 1 2 3 6 add(1, 2)(3) // 1 2 3 6 add(1, 2, 3) // 1 2 3 6 add(1)(2, 3) // 1 2 3 6  4. bind
  bind()   方法创建一个新的函数,在  bind()   被调用时,这个新函数的  this   被指定为  bind()   的第一个参数,而其余参数将作为新函数的参数,供调用时使用。MDN
  姐妹篇 call实现
  姐妹篇 apply实现  Function.prototype.bind2 = function (context, ...args) {   if (typeof this !== "function") {     throw new TypeError("Bind must be called on a function")   }    const executeBound = function(sourceFunc, boundFunc, context, callingContext, args) {     if (!(callingContext instanceof boundFunc)) {       // 如果调用方式不是new func的形式就直接调用sourceFunc,并且给到对应的参数即可       return sourceFunc.apply(context, args)     } else {       // 类似于执行new的几个过程       const self = Object.create(sourceFunc.prototype) // 处理new调用的形式       const result = sourceFunc.apply(self, args)       // 判断函数执行后的返回结果 非对象函数,则返回self       if (result && typeof result === "object" || typeof result === "function") {         return result       } else {         return self       }     }   }   const func = this      const bound = function (...innerArgs) {     return executeBound(func, bound, context, this, args.concat(innerArgs))   }    return bound }  // 测试 // 1. 普通调用 const showName = function (sex, age) {   console.log(this, sex, age) }  showName.bind2({ name: "前端胖头鱼" }, "boy")(100) // { name: "前端胖头鱼" } "boy" 100  // 2. new 调用 const Person = function (name) {   this.name = name }  Person.prototype.showName = function (age) {   console.log(this, this.name, age) }  const bindPerson = Person.bind(null, "boy") const p1 = new bindPerson("前端胖头鱼")  p1.showName(100) // Person { name: "boy" } "boy" 100 5. 实现一个简易版模板引擎
  jQuery时代,模板引擎用的还是比较多的,可以理解为它是这样一个函数,通过模板 + 数据经过一段黑盒操作最后得到需要展示的页面   const render = (template, data) => {   // s*?是为了兼容{{name}} {{ name }}这种写法   return template.replace(/{{s*?(w+)s*?}}/g, (match, key) => {     // 匹配中了则读取替换,否则替换为空字符串     return key && data.hasOwnProperty(key) ? data[ key ] : ""   }) } const data = {   name: "前端胖头鱼",   age: 100 } const template = `   我是: {{ name }}   年龄是: {{age}} ` console.log(render(template, data)) /* 我是: 前端胖头鱼 年龄是: 100 */ 6. 类数组转化为数组的4种方式// 类数组转化为数组 const arrayLikeObj = {   0: "前端胖头鱼",   1: 100,   length: 2 }  // 1. [].slice console.log([].slice.call(arrayLikeObj)) // 2. Array.from console.log(Array.from(arrayLikeObj)) // 3. Array.apply console.log(Array.apply(null, arrayLikeObj)) // 4. [].concat console.log([].concat.apply([], arrayLikeObj))   7. 请实现 DOM2JSON 一个函数,可以把一个 DOM 节点输出 JSON 的格式
  曾经在字节的面试中出现过   const dom2json = (rootDom) => {   if (!rootDom) {     return    }    let rootObj = {     tagName: rootDom.tagName,     children: []   }    const children = rootDom.children   // 读取子节点(元素节点)   if (children && children.length) {     Array.from(children).forEach((ele, i) => {       // 递归处理       rootObj.children[ i ] = dom2json(ele)     })   }    return rootObj }
  测试                dom2json          

hello world 前端胖头鱼 100   image.png 8. 列表转树形结构   相信大家工作中也遇到过类似的问题,前端需要的是树形结构的数据,但是后台返回的是一个list,我们需要将list转化为树形结构(当然这里你也可以把你的 后端同学干啪 为啥不给我想要的数据)。 const arrayToTree = (array) => { const hashMap = {} let result = [] array.forEach((it) => { const { id, pid } = it // 不存在时,先声明children树形 // 这一步也有可能在下面出现 if (!hashMap[id]) { hashMap[id] = { children: [] } } hashMap[id] = { ...it, children: hashMap[id].children } // 处理当前的item const treeIt = hashMap[id] // 根节点,直接push if (pid === 0) { result.push(treeIt) } else { // 也有可能当前节点的父父节点还没有加入hashMap,所以需要单独处理一下 if (!hashMap[pid]) { hashMap[pid] = { children: [] } } // 非根节点的话,找到父节点,把自己塞到父节点的children中即可 hashMap[pid].children.push(treeIt) } }) return result } // 测试 const data = [ // 注意这里,专门把pid为1的元素放一个在前面 { id: 2, name: "部门2", pid: 1 }, { id: 1, name: "部门1", pid: 0 }, { id: 3, name: "部门3", pid: 1 }, { id: 4, name: "部门4", pid: 3 }, { id: 5, name: "部门5", pid: 4 }, { id: 7, name: "部门7", pid: 6 }, ] console.log(JSON.stringify(arrayToTree(data), null, 2)) /* [ { "id": 1, "name": "部门1", "pid": 0, "children": [ { "id": 2, "name": "部门2", "pid": 1, "children": [] }, { "id": 3, "name": "部门3", "pid": 1, "children": [ { "id": 4, "name": "部门4", "pid": 3, "children": [ { "id": 5, "name": "部门5", "pid": 4, "children": [] } ] } ] } ] } ] */ 9. 树形结构转列表   反过来也可以试试看 const tree2list = (tree) => { let list = [] let queue = [...tree] while (queue.length) { // 从前面开始取出节点 const node = queue.shift() const children = node.children // 取出当前节点的子节点,放到队列中,等待下一次循环 if (children.length) { queue.push(...children) } // 删除多余的children树形 delete node.children // 放入列表 list.push(node) } return list } // 测试 const data = [ { "id": 1, "name": "部门1", "pid": 0, "children": [ { "id": 2, "name": "部门2", "pid": 1, "children": [] }, { "id": 3, "name": "部门3", "pid": 1, "children": [ { "id": 4, "name": "部门4", "pid": 3, "children": [ { "id": 5, "name": "部门5", "pid": 4, "children": [] } ] } ] } ] } ] console.log(tree2list(data)) /* [ { id: 1, name: "部门1", pid: 0 }, { id: 2, name: "部门2", pid: 1 }, { id: 3, name: "部门3", pid: 1 }, { id: 4, name: "部门4", pid: 3 }, { id: 5, name: "部门5", pid: 4 } ] */ 10. sleep   实现一个函数,n秒后执行函数func const sleep = (func, delay) => { return new Promise((resolve) => { setTimeout(() => { resolve(func()) }, delay) }) } const consoleStr = (str) => { return () => { console.log(str) return str } } const doFns = async () => { const name = await sleep(consoleStr("前端胖头鱼"), 1000) const sex = await sleep(consoleStr("boy"), 1000) const age = await sleep(consoleStr(100), 1000) console.log(name, sex, age) } doFns() // 前端胖头鱼 1s later // boy 2s later // 100 3s later // 前端胖头鱼 boy 100 11. 菲波那切数列斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 给你 n ,请计算 F(n) 。 示例 1: 输入:2 输出:1 解释:F(2) = F(1) + F(0) = 1 + 0 = 1 示例 2: 输入:3 输出:2 解释:F(3) = F(2) + F(1) = 1 + 1 = 2 示例 3: 输入:4 输出:3 解释:F(4) = F(3) + F(2) = 2 + 1 = 3 暴力实现   根据题目意思,很容易写出下面递归的暴力代码 const fib = (n) => { if (n === 0) { return 0 } if (n === 1 || n === 2) { return 1 } return fib(n -2) + fib(n - 1) } // 测试 console.log(fib(1)) // 1 console.log(fib(2)) // 1 // 试着统计一下计算时间 const t1 = Date.now() console.log(fib(44)) // 701408733 console.log(Date.now() - t1) // 接近4393 缓存优化   上面的代码可以实现效果,但是性能堪忧,来看一个计算 fib(10) 的过程 // 计算10 10 => 9 + 8 // 需要计算9和8 9 => 8 + 7 // 需要计算8和7 8 => 7 + 6 // 需要计算7和6 7 => 6 + 5 // 需要计算6和5 6 => 5 + 4 // 需要计算5和4 5 => 4 + 3 // 需要计算4和3 4 => 3 + 2 // 需要计算3和2 2 => 1 + 0 // 需要计算1和0   这个过程中如果按照上面暴力实现的代码会重复多次计算某些曾经计算过的值,比如8、7、6、5...等等,这个损耗是没有必要的,所以我们可以把计算的结果进行缓存,下次遇到求同样的值,直接返回即可 const fib = (n) => { // 缓存过直接返回 if (typeof fib[ n ] !== "undefined") { return fib[ n ] } if (n === 0) { return 0 } if (n === 1 || n === 2) { return 1 } const res = fib(n -2) + fib(n - 1) // 缓存计算的结果 fib[ n ] = res return res } console.log(fib(1)) // 1 console.log(fib(2)) // 1 const t1 = Date.now() console.log(fib(44)) // 701408733 console.log(Date.now() - t1) // 1ms 12. 实现一个函数sum函数   实现一个函数sum函数满足以下规律 sum(1, 2, 3).valueOf() // 6 sum(2, 3)(2).valueOf() // 7 sum(1)(2)(3)(4).valueOf() // 10 sum(2)(4, 1)(2).valueOf() // 9   分析   仔细观察这几种调用方式可以得到以下信息 sum函数可以传递一个或者多个参数 sum函数调用后返回的是一个新的函数且参数可传递一个或者多个 调用.valueOf时完成最后计算   看起来是不是有点 函数柯里化 的感觉,前面的函数调用仅仅是在缓存每次调用的参数,而valueOf的调用则是拿着这些参数进行一次求和运算并返回结果 const sum = (...args) => { // 声明add函数,其实主要是缓存参数的作用 // 注意add调用完成还是会返回add函数本身,使其可以链式调用 const add = (...args2) => { args = [ ...args, ...args2 ] return add } // 求和计算 add.valueOf = () => args.reduce((ret, num) => ret + num, 0) return add } // 测试 console.log(sum(1, 2, 3).valueOf()) // 6 console.log(sum(2, 3)(2).valueOf()) // 7 console.log(sum(1)(2)(3)(4).valueOf()) // 10 console.log(sum(2)(4, 1)(2).valueOf()) // 9


相聚鹏城问道资本资本策划师(CCP)认证班深圳开讲时光荏苒。相隔两个月,10月2628日,中国资本策划研究院首批资本策划师(CCP)认证学员,重聚在深圳金融培训中心,开始第二次课程的学习之旅。中国资本策划研究院院长CCP创始人朱耿这才是折叠屏旗舰的标准,华为MateX2发布配置设计冲顶2月22日,华为发布新一代折叠旗舰华为MateX2,顶级硬件创新交互应用生态三位一体,定义折叠旗舰行业标准。这将是折叠屏手机的一次巨大飞跃,刷新我们对于折叠屏手机的期待。常务董事华CCP学员分享许德璋总会计师隆利建设集团许德璋隆利建设集团总会计师硕士研究生,30多年银行从业经验,曾任职中行浦发行,历任风控部总经理风险审批委员会委员分行纪委委员等,后出任隆利建设集团(前身保利建设集团)总会计师,目前荣耀MagicBookV14领衔众新品发布,全场景智慧生活从连接开始9月26日,2021荣耀智慧生活新品发布会正式举行。发布会以智慧科技至美生活为主题,推出包括笔记本智慧屏平板等在内的多款全场景智能终端设备。此次发布会荣耀带来了惊艳的融合产品与技术朱耿洲恒大集团陷入资金危机,许家印自己该不该掏钱出来还债?朱耿洲CCP论题第63期综述报道学融资与资本运作真功夫,交人生与事业腾飞真挚友!近年来,中国资本策划研究院院长朱耿洲博士以破解中小企业融资难为已任,在包括清华北大人大等金融资本总裁平台超前点播,你还会买单吗在微博输入超前点播,便会出来如下什么是超前点播?超前点播就是在已经开了会员的情况下,再自己花钱买单集,即V中V,简称VVIP,说的再好听一点,官方点,资本一点,就叫超前点播。最近孙九年十代,无畏生长,续航够任性!高清图说麦芒10SE5G让年轻用户借由新科技,体验无畏青春与无界自由。麦芒手机自2013年诞生,便一直秉持着无畏生长的品格。作为科技自媒体,我们也有幸见证了麦芒手机的一路发展。历经9年10次迭代升级,青青全职高手讯飞智能录音笔SR302评测,当年要有它我也能成学霸录转写(录音转文字)多国语言通吃(方言也在行)还能边录边翻译去年评测讯飞智能录音笔SR702时燕山派就曾感叹,这货不只是对于工作中的会议记录工作记录实用,对于学生同样有用,如果当年有志者事竟成喜迎第二批资本策划师(CCP)第二批资本策划师(CCP)认证考试成绩放榜一年多的奔波与学习没有白费,多少次熬夜作业终有结果,几年的愿望即将梦想成真。获知自己通过资本策划师(CCP)认证考试后,顾学员激动地表示。融资创新助力企业腾飞与发展朱耿洲博士在武汉讲学纪实风樯动,龟蛇静,起宏图。一桥飞架南北,天堑变通途。这是当年一代伟人笔下大气豪迈的江城武汉。5月2223日,武汉欧亚会展国际酒店,中国资本策划研究院(CCP)院长朱耿洲博士应邀来到这风投教父熊晓鸽的25条投资真经在业内,熊晓鸽有一套独特的投资理论,尊重技术,但更尊重市场看重项目,但最看重团队重视资本回报,也犹为重视对项目本身的了解和学习。以下25条格言,由投资界从熊晓鸽在不同场合的讲话中摘
远大住工与腾讯云达成战略合作联手布局智慧建筑领域中证网讯(记者吴科任)日前,远大住宅工业集团股份有限公司(简称远大住工)与腾讯云计算(北京)有限公司(简称腾讯云)签署战略合作协议。基于远大住工全流程数字信息化体系和全球化规模化专摩托罗拉代号为Frontier的高端旗舰,是否是明天将发布的新机由于高通还没有发布台积电代工的骁龙8Gen1芯片,这款手机如果在5月10日发布有点为时过早。摩托罗拉代号为Frontier的高端旗舰摩托罗拉已经确认将于5月10日在中国举办新品发布重视人才,致力研发,360争做数字安全时代的弄潮儿近日,各大数字安全公司纷纷发布了2021年的年报,从中我们可以看出,如今的网络安全已经逐步转型为数字安全,对于影响力日益提高的数字安全问题,已经不仅仅关乎到我们个人的隐私问题,更是苹果与中国供应链彻底脱钩会带来哪些影响?苹果公司最近几年一直动作不断,逐渐把一些供应链转移到中国大陆以外的地区,比如东南亚和印度,今年更是不断放话,要彻底将供应链迁移出中国大陆。其实,苹果已从美国,印度,越南,日本和世界传奇女性柳青患癌5年,离异带3娃,把滴滴做成行业老大她是联想教父改革先锋柳传志之女,出身于书香门第。毕业于北京大学,进修于哈佛大学,实习于国际投资银行高盛集团。她是一个富二代,本可安稳一生,继承家业,却不安现状,积极上进,舍弃家族产国产机里也有高端,这四款很难挑出毛病,还比苹果便宜之前一谈到高端机,很多人只联想到苹果手机。殊不知,国产手机已经在高端手机市场悄悄发力很久了,今天我们聊五款高端国产手机,无论是性能还是外观都很难挑出毛病,价格还比苹果便宜。vivo全国首例短视频爬虫案宣判涉爬虫的刑法案件及刑事法律规制南方财经全媒体集团记者徐倩宜北京报道在互联网时代,互联网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。无论是搜索引擎,还是个人或单位获取目标数据,都需要从公开华为20级大佬暴力推荐!并发编程深度解析实战七天杀上GitHub榜首前言并发编程!在一二线互联网公司的面试中,逃避不了也是必问的面试题,而绝大部分程序员对并发编程的理解也都停留在使用阶段。那么今天团长给大家推荐的这份资料,绝对可以帮到你。本书涵盖了又一陷阱正在掏空国人?9亿人参与其中,高层终于出手了?互联网的发展,必然会带来有利和有弊的方面,互联网更是一把双刃剑,在使用互联网的时候,更加要清醒地认识到如何让互联网,为自己带来方便快捷的服务。我国的信用卡和借记卡的数量,是呈现出不正式官宣!华为5G手机壳终于来了本文原创,请勿抄袭和搬运,违者必究各大厂商都在大力推广5G手机,支持双模已经是最基本的要求了,更是要在基带芯片领域不断提高5G通信服务质量。但是和大力推广5G手机不同,华为因为世人用了半年iPhone13Pro,还是换回华为Mate40Pro,憋了好多话想说iPhone和华为在国内一直是被争相选择的对象,我之前用了半年的华为Mate40Pro,后来iPhone13Pro出了之后也跟风换了13Pro,用了半年的iPhone13Pro,最