一、柯理化
示例:
function addNew(x){
return function(y){
return x+y;
}
}
console.log(add(1,2));
console.log(addNew(2)(3));
二、防抖两种方式
示例:
var num = 1;
let times;
先执行
content.onmousemove = function (){
let obj = times;
clearTimeout(times);
times = setTimeout(()=>{
times = null;
},1000)
if(!obj){
console.log(typeof !obj);
content.innerHTML = num++;
}
};
后执行
content.onmousemove = function (){
clearTimeout(times);
times = setTimeout(()=>{
content.innerHTML = num++;
},1000)
};
三、节流两种方式
示例:
延时器
var time;
content.onmousemove = function(){
if(!time){
time = setTimeout(()=>{
time = null;
content.innerHTML = num++;
},1000)
}
时间戳
var content = document.getElementById("content");
var num = 1;
var timeNew = 0;
content.onmousemove = function(){
var timeOld = Date.now();
if(timeOld-timeNew>1000){
timeNew = timeOld;
content.innerHTML = num++;
}
}
四、闭包的特性
①函数嵌套函数
②函数内部可以引用函数外部的参数和变量
③参数和变量不会被垃圾回收机制回收
示例:
function a(){
var name = "dov";
return function(){
return name;
}
}
console.log(a()());
var b = a();
console.log(b());
1、闭包的好处:
①保护函数内的变量安全 ,实现封装,防止变量流入其他环境发生命名冲突
②在内存中维持一个变量,可以做缓存(但使用多了同时也是一项缺点,消耗内存)
③匿名自执行函数可以减少内存消耗。
2、闭包的坏处:
①其中一点上面已经有体现了,就是被引用的私有变量不能被销毁,增大了内存消耗,造成内存泄漏,解决方法是可以在使用完变量后手动为它赋值为null;
②其次由于闭包涉及跨域访问,所以会导致性能损失,我们可以通过把跨作用域变量存储在局部变量中,然后直接访问局部变量,来减轻对执行速度的影响。
示例:
for(var i=0;i<5;++i){
(function(i){
setTimeout(()=>{
console.log(i);
},1000*i)
}(i))
}
console.log(1111111);
console.log(222222);
五、JavaScript为什么是单线程
1.首先是历史原因,在创建 javascript 这门语言时,多进程多线程的架构并不流行,硬件支持并不好。
2.其次是因为多线程的复杂性,多线程操作需要加锁,编码的复杂性会增高。
3.而且,如果同时操作 DOM ,在多线程不加锁的情况下,最终会导致 DOM 渲染的结果不可预期。
六、什么是同步任务?什么是异步任务?
1、同步任务:在主线程上排队执行的任务,只有前一个任务执行完毕,才能执行后一个任务
2、异步:不进入主线程、而进入"任务队列"(task queue)的任务,只有"任务队列"通知主线程,某个异步任务可以执行了,该任务才会进入主线程执行。
1.JS任务 分为同步任务(synchronous)和异步任务(asynchronous)。
2.同步任务都在 JS引擎线程(主线程) 上执行,形成一个执行栈(call stack)。
3.事件触发线程 管理一个 任务队列(Task Queue)。
4.异步任务 触发条件达成,将 回调事件 放到任务队列(Task Queue)中。
5.执行栈中所有同步任务执行完毕,此时JS引擎线程空闲,系统会读取任务队列,将可运行的异步任务回调事件添加到执行栈中,开始执行。
示例:
console.log(1)
setTimeout(()=>{
console.log(2)
},100)
console.log(3)
七、 Array.of()创建数组
示例:
var a = Array.of(1,2,3,"abc",undefined,{name:1},function aa(){});
console.log(a);
var b = [1,,2,3];
var c = new Array(3,4,5);
console.log(b);
八、Array.from(类数组,循环,改变this指向)
1、可选,map 函数,用于对每个元素进行处理,放入数组的是处理后的元素。
2、可选,用于指定 map 函数执行时的 this 对象。
示例:
var a = Array.from([1,,2,3,"abc",{name:1}]);
console.log(a);
var a = Array.from([1,2,3],function(item){
return item*2;
});
var a = Array.from([1,2,3],(item)=>item*2);
console.log(a);
let obj = {
do:(n)=>{
return n*10;
}
}
console.log(obj.do(4));
var a = Array.from([1,2,3],function(item){
return this.do(item);
},obj);
console.log(a);
let map = new Map([[1,2,3]]);
map.set('key0', 'value0');
map.set('key1', 'value1');
console.log(map);
console.log(Array.from(map));
let set = new Set([1,2,3]);
set.add(10);
set.add(11);
console.log(set);
console.log(Array.from(set));
let str = "hello";
console.log(Array.from(str));
let set = new Set(str);
console.log(set);
九、find()方法
1、查找数组中符合条件的元素,若有多个符合条件的元素,则返回第一个元素。
示例:
let arr = Array.of(1, 2, 3, 4);
console.log(arr.find((item) => {
return item>2;
}));
2、 findIndex()查找的是拿元素值去查询下标,则返回第一个元素下标。
示例:
console.log(arr.findIndex((item) => item==4));
3、fill(填充的值,包含起始下标,不包含结束下标默认到最后)将一定范围索引的数组元素内容填充为单个指定的值。
示例:
console.log(arr.fill(0,0,2));
4、copyWithin()将一定范围索引的数组元素修改为此数组另一指定范围索引的元素。
参数1:被修改的起始索引
参数2:被用来覆盖的数据的起始索引
参数3(可选):被用来覆盖的数据的结束索引,默认为数组末尾
示例:
console.log([1, 2, 3, 4,5,6,7,8,9].copyWithin(0,2,5));