加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

每日一题

发布时间:2020-12-15 20:31:36 所属栏目:百科 来源:网络整理
导读:来源于https://github.com/Advanced-Frontend/Daily-Interview-Question/blob/master/datum/summary.md 一天最少一道题,把看过的题整理一下 ? 第 1 题:写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么? key是给每一个vnode的唯一id,可以

来源于https://github.com/Advanced-Frontend/Daily-Interview-Question/blob/master/datum/summary.md

一天最少一道题,把看过的题整理一下

?

第 1 题:写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?

  key是给每一个vnode的唯一id,可以依靠key,更准确,更的拿到oldVnode中对应的vnode节点。

1) 更准确

  因为带key就不是就地复用了,在sameNode函数?a.key === b.key对比中可以避免就地复用的情况。所以会更加准确。

2) 更快

  利用key的唯一性生成map对象来获取对应节点,比遍历方式更快。(这个观点,就是我最初的那个观点。从这个角度看,map会比遍历更快。)

在交叉对比中,当新节点跟旧节点头尾交叉对比没有结果时,会根据新节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key => index 的map映射)。如果没找到就认为是一个新增节点。而如果没有key,那么就会采用遍历查找的方式去找到对应的旧节点。一种一个map映射,另一种是遍历查找。相比而言。map映射的速度更快

第 2 题:[‘1‘,‘2‘,‘3‘].map(parseInt)?what & why ?

1)map()方法

var new_array = arr.map(function callback(currentValue[,index[,array]]) {
 // Return element for new_array 
}[,thisArg])

  callback 接受三个参数: currentValue( callback?数组中正在处理的当前元素 ),index可选(callback?数组中正在处理的当前元素的索引),array可选(callback??map?方法被调用的数组

2)
parseInt(string,radix) 方法

  则是用来解析字符串的,使字符串成为指定基数的整数。

  接收两个参数,第一个表示被处理的值(字符串),第二个表示为解析时的基数(需要在2-36之间)

3)?parseInt(‘1‘,0) //radix为0时,且string参数不以“0x”和“0”开头时,按照10为基数处理。这个时候返回1

  parseInt(‘2‘,1) //radix小于2,NAN

  parseInt(‘3‘,2) //2进制的时候值应该是0 1,3是不合法的

第 3 题:什么是防抖和节流?有什么区别?如何实现?

?

1)防抖动

  触发高频事件后n秒内函数只会执行一次,如果n秒内高频事件再次被触发,则重新计算时间。

  每次触发事件时都取消之前的延时调用方法。

  例如需要监听输入框,在输入内容后对内容进行处理,每次输入都进行处理会加大操作频率,所以我们希望输入完成后再执行操作函数,减少函数的执行频率。

 1     function debounce(fn) {
 2       let timeout = null; // 创建一个标记用来存放定时器的返回值
 3       return function () {
 4         clearTimeout(timeout); // 每当用户输入的时候把前一个 setTimeout clear 掉
 5         timeout = setTimeout(() => { // 然后又创建一个新的 setTimeout,这样就能保证输入字符后的 interval 间隔内如果还有字符输入的话,就不会执行 fn 函数
 6           fn.apply(this,arguments);
 7         },500);
 8       };
 9     }
10     function sayHi() {
11       console.log(‘防抖成功‘);
12     }
13 
14     var inp = document.getElementById(‘inp‘);
15     inp.addEventListener(‘input‘,debounce(sayHi)); // 防抖

?

2)节流

  高频触发的事件,但在n秒内只会执行一次,所以节流会稀释函数的执行频率。

  动作绑定事件,动作发生后一段时间后触发事件,在这段时间内,如果动作又发生,则无视该动作,直到事件执行完后,才能重新触发。

 1   function throttle(fn) {
 2       let canRun = true; // 通过闭包保存一个标记
 3       return function () {
 4         if (!canRun) return; // 在函数开头判断标记是否为true,不为true则return
 5         canRun = false; // 立即设置为false
 6         setTimeout(() => { // 将外部传入的函数的执行放在setTimeout中
 7           fn.apply(this,arguments);
 8           // 最后在setTimeout执行完毕后再把标记设置为true(关键)表示可以执行下一次循环了。当定时器没有执行的时候标记永远是false,在开头被return掉
 9           canRun = true;
10         },500);
11       };
12     }
13     function sayHi(e) {
14       console.log(e.target.innerWidth,e.target.innerHeight);
15     }
16     window.addEventListener(‘resize‘,throttle(sayHi));
 1 function throtte(func,time){
 2     let activeTime = 0;
 3     return () => {
 4       const current = Date.now();
 5       if(current - activeTime > time) {
 6         func.apply(this,arguments);
 7         activeTime = Date.now();
 8       }
 9     }
10   }

3)总结:

防抖和节流的目的都是防止一个事件频繁触发回调函数,区别:

节流函数 不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数。

防抖动 只是在最后一次事件后才触发一次函数。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读