每日一题
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)总结:
防抖和节流的目的都是防止一个事件频繁触发回调函数,区别:
节流函数 不管事件触发有多频繁,都会保证在规定时间内一定会执行一次真正的事件处理函数。
防抖动 只是在最后一次事件后才触发一次函数。
以上是关于每日一题的主要内容,如果未能解决你的问题,请参考以下文章