var、let和const的区别
- var没有块级作用域,let和const有块级作用域
for(var i=0;i<5;i++) {
console.log(i);
}
console.log(i);
for(let i=0;i<5;i++) {
console.log(i);
}
console.log(i);
- var 有变量提升 let const 没有变量提升
console.log(a);
var a = 10;
var a = 5;
var a = 10;
console.log(a);
- 暂时性死区:
- let/const会被先创建出来,但还未绑定值,所以不能用
- 不要再let const声明前使用变量,用了会触发暂时性死区
a=100;
let a = 20;
var a = 5;
var a = 10;
console.log(a);
flat拍平数组
const arr = [1,2,[3,4]];
const res = flat(arr);
console.log(res);
function flat(arr){
return Array.prototype.concat.apply([],arr)
}
const arr = [1,2,[3,4,[5,6]]];
const res = flat(arr);
console.log(res);
function flat(arr){
const hasDeep = arr.some(item => item instanceof Array)
if(! hasDeep) {
return arr;
}
const res = Array.prototype.concat.apply([],arr);
return flat(res);
}
const arr = [1,2,[3,4,[5,6]]];
const res = flat(arr);
console.log(res);
function flat(arr){
while(arr.some(item => item instanceof Array)){
arr = Array.prototype.concat.apply([],arr);
}
return arr;
}
数组去重
const arr = [10,20,20,30,50,50,60];
console.log(unique(arr));
function unique(arr){
const set = new Set(arr);
return [...set]
}
function unique(arr){
const res = [];
arr.forEach(item => {
if (res.indexOf(item)===-1) {
res.push(item);
}
});
return res;
}

数组中的最大值
const arr = [100,5,20,3,200,6];
console.log(getMax(arr));
function getMax(arr){
return arr.reduce((n1,n2)=>{
return n1>n2 ? n1:n2
})
}
function getMax(arr){
arr.sort((n1,n2)=>{
return n2-n1;
});
return arr[0];
}
防抖和节流的区别:
- 防抖debounce:在事件频繁被触发时,只执行最后一次,input输入
<body>
<h1>防抖和节流</h1>
<input type="text">
<div></div>
</body>
<script>
const oInp = document.querySelector("input");
oInp.addEventListener(
"keyup",
debounce(function(){
console.log(oInp.value+"取后台请求");
})
)
function debounce(fn){
let timer = null;
return function(){
if(timer) clearTimeout(timer);
timer = setTimeout(()=>{
fn.call(this.arguments);
timer = null;
},1000)
}
}
</script>

- 节流throttle:减少事件执行的次数,有规律地执行,拖拽,scroll
<h1>节流</h1>
<div draggable="true"></div>
const oDiv = document.querySelector("div");
oDiv.addEventListener("drag",
throttle(function(e){
console.log(e.clientX);
}));
function throttle(fn){
let timer = null;
return function(){
if(timer) return;
timer = setTimeout(()=>{
fn.apply(this,arguments);
console.log(this,arguments);
timer = null;
},100)
}
}
