每日一题

Posted shuran

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日一题相关的知识,希望对你有一定的参考价值。

来源于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)总结:

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

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

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

 

 

 

 

 

 


 

 

 

以上是关于每日一题的主要内容,如果未能解决你的问题,请参考以下文章

笔试强训之每日一题

笔试强训之每日一题

笔试强训每日一题

笔试强训之每日一题

笔试强训之每日一题

算法·每日一题(详解+多解)-- day14