JavaScript 常用知识汇总

一、节流、防抖

1. 节流

  • 概括:类似于一种阀门一样的开关函数,也就是在函数执行一次后,某段时间内暂时失效,过了这段时间后在重新激活(类似于大招的冷却时间)
  • 使用场景
    • 保存、提交防重复点击
    • 输入框input事件
 function throttle(fn,delay){
    let valid = true
    return function() {
       if(!valid){
           return false 
       }

        valid = false
        setTimeout(() => {
            fn()
            valid = true;
        }, delay)
    }
 }

 function showTop  () {
    var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  console.log('滚动条位置:' + scrollTop);
 }
 window.onscroll = throttle(showTop,1000) 

2. 防抖

  • 概括:在第一次触发事件时,不立即执行函数,而是给一个期限值。如果在期限值内没有触发该方法就执行,如果在该期限值内再次执行就重新开始计时

  • 使用场景

    • 滚动条事件
    • 拖拽效果
    • 浏览器resize事件(浏览器尺寸缩放时执行的事件)
    function debounce(fn,delay){
        let timer = null //借助闭包
        return function() {
            if(timer){
                clearTimeout(timer) 
            }
            timer = setTimeout(fn,delay) // 简化写法
        }
    }
    // 然后是旧代码
    function showTop  () {
        var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
      console.log('滚动条位置:' + scrollTop);
    }
    window.onscroll = debounce(showTop,1000)
    

二、回流、重绘

1. 回流

  • 概括:当页面进行加载的时候会重新对dom元素会进行渲染,渲染的过程成为回流

2. 重绘

  • 概括:当回流的时候,会有部分失效的元素属性(样式)或者新改变的元素属性(样式)进行重新绘制到页面中,这样的过程成为重绘

三、宏任务、微任务

1. 宏任务

  • 概括:是基于宿主环境进行执行的程序队列,比如说绑定事件、setTimeout、setInterval、ajax

2. 微任务

  • 概括:是基于js引擎进行执行的任务程序队列,比如说Promise、async/await、Object.proxy
 setTimeout(function(){
    console.log('1');
 });
 new Promise(function(resolve){         
    console.log('2');
    resolve();
 }).then(function(){            
    console.log('3');
 }).then(function(){
    console.log('4')
 });        
 console.log('5');

 // 2 5 3 4 1

四、同步、异步

1. 同步

  • 概括:因为js是单线程,根据js代码执行顺序从上至下依次执行称为同步
 consoled.log(0)
 let str = 1 
 console.log(str)
 console.log(2)
 // 0 1 2

2. 异步

  • 概括:当程序执行到异步代码时,会将异步代码放置异步池里面,而不会影响同步代码的执行,类似于Java中的多线程
 console.log(1)
 setTimeout(() => {
     console.log(2)
 })
 console.log(3)
// 1 3 2

3. 区别

  • 同步 会阻塞后续代码的执行,异步 不会阻塞后续代码的执行

五、高内聚、低耦合

1. 高内聚

  • 概括:一个模块中,里面的多个元素之间的联系越紧密,关联程度越高,内聚性越高

2. 低耦合

  • 概括:每个模板之前联系越紧密关联度越高,则独立性越差,耦合性越高

六、闭包

  1. 概括:函数外部可以访问函数内部的变量
  2. 原理
    • 触发垃圾回收机制
    • 将数据暂时储存起来,如果需要使用再次调用,如不需要在销毁
  3. 缺点:造成内存的占用,使用不当会造成内存泄漏
  4. 优点:可以在外部操作作用域中的变量,减少了变量污染,相当于声明了一个全局的私有变量

七、原型链

  1. 概括:每个函数或者类都有一个属性 prototype,可以通过prototype访问到自己的原型对象,类实例化的对象也可以通过_ _ proto _ _访问到原型对象,原型对象也有自己的原型对象,依次往上直到访问到顶层,这样的链式结构被称为原型链
  2. 优点:实现类的继承,可以将一些方法或者属性储存到里面,提高方法的扩展性

八、this指向

指向场景:

  1. 在函数内部指向 -- window
  2. 在定时器中指向 -- window
  3. 在对象中的函数指向 -- 对象
  4. 在事件函数中指向 -- 事件源
  5. 在构造函数中指向 -- 实例化对象
  6. 在constructor(构造方法)中指向 -- 实例化对象
  7. 在类中指向 -- 实例化对象
  8. 再箭头函数中指向 -- 宿主对象(父级的指向)

改变指向:

  1. call() 方法

    概括:如果不传参默认指向window

    参数

    • 参数1:目标this指向
    • 参数2+:之后的参数就是函数的形参
     var obj= {
        name:"lixue",
        age:21
     }
     function fn(x,y){
        console.log(x+","+y);
        console.log(this);
        console.log(this.name);
        console.log(this.age);
     }
     fn.call(obj,"hh",20); // 此时this指向对象obj
    
  2. apply() 方法

    概括:不传参默认指向window

    参数

    • 参数1:目标this指向
    • 参数2:不管之后有几个参数统一写入数组
     var obj= {
        name:"lixue",
        age:21
     }
     function fn(x,y){
        console.log(x+","+y);
        console.log(this);
        console.log(this.name);
        console.log(this.age);
     }
     fn.apply(obj,["hh",20]); // 此时this指向对象obj
    
  3. bind() 方法

    概括:该方法会创建新函数改变新函数的this指向,不会改变原始函数的this指向

    参数

    • 参数1:目标this指向
    • 参数2+:之后的参数就是新函数的参数
     // 此方法和以上两种方法不同, bind方法会产生一个新的函数设置新函数中的this指向
     function fn(){
        // 此时this指向新函数
        console.log(this);
        console.log(arguments);
        return "hahahahha";
     }
     // 产生一个新的函数,此时this指向函数
     var res = fn.bind("hello",10,20,30,40);
     res();
     console.log(res);
    
  4. 区别

    • call方法和apply方法都是改变原有函数的this指向,而bind方法会生成一个新的函数改变新函数的this指向
    • call方法的bind方法 参数2+ 都是以平铺的方式进行传参,二而apply方法将参数2+ 的多个参数合并成为一个数组

九、高并发

  1. 概括:指的是用户因为请求次数过多,导致的服务器负载压力过大
  2. 优化
    • 减少Http请求次数
    • 服务器进行负载均衡操作,将一台服务器的压力分发到多台服务器上,从而减少服务器压力
    • 整合前端资源,将资源进行压缩
      • css代码压缩
      • html代码压缩
      • js代码压缩
      • css图片使用精灵图
      • css图片使用Base64格式编码直接嵌入页面

十、跨域

  1. 概括:由于受到浏览器同源策略的限制,不同协议、不同端口、不同域名的情况下不可以互相访问,如互相访问的情况下被称为跨域
  2. 实现方法
    • JSONP:通过script标签的src属性不受同源策略的限制实现跨域(只能支持GET请求)
    • CORS:通过后端进行配置 Access-Control-Allow-Origin 属性,实现跨域
    • Nginx:通过Nginx(中间件)将请求反向代理到指定的服务器,实现跨域

十一、localStorage、sessionStorage、cookie

1. loacalStorage

  • 概括:主要要来本地储存使用,用来解决cookie储存空间不足问题
  • 优点:比cookie储存空间大,相当于在前端有个5M大小的数据库,安全性比较高
  • 缺点:兼容性不太好(IE8以上),浏览器隐私模式下不可以被读取到
  • 操作
    • 储存数据:localstorage.setItem(key,value)
    • 读取数据:localStorage.getItem(key)
    • 删除数据:localStorage.removeItem(key)
    • 修改数据:localStorage.setItem(新的键,新的值)

2. sessionStorage

  • 概括:和localStorage同为本地储存,但是sessionStorage是会话时效,一旦浏览器关闭将会清除数据
  • 操作:和localStorage相同

3. cookie

  • 概括:浏览器本地储存数据,储存大小约为4K
  • 操作
    • 储存:document.cookie='属性=值';expires='时间字符串';
    • 读取:document.cookie
    • 删除:设置有效期过期

十二、栈和堆

1. 栈内存

  • 概括:主要储存一些基本数据类型和复杂数据类型的地址
  • 基本数据类型:String、Number、Boolean、Undefined、Null

2. 堆内存

  • 概括:主要储存一些复杂数据类型,复杂数据类型通过栈内存中的地址访问到堆内存中对应的数据
  • 复杂数据类型:Function、Array、Object

  • 如有概括错误,欢迎各位网友斧正🎈
  • 敬请期待后续更新⏳
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容