为期两月的面试整理

本文深入解析了前端开发中的核心概念和技术,包括JavaScript的高级特性如箭头函数、Promise、异步编程等,Vue框架的使用技巧及优化策略,以及浏览器的工作原理等。

目录

一、js部分

箭头函数与普通函数的区别

Promise async和await

js继承

事件循环机制(Event Loop)

js事件阶段和事件委托

js垃圾回收机制

双等于‘==’引出的一系列违反常理的情况

二、vue部分

vue插件、指令、组件和过滤器

vue组件通信方式

vuex的使用、加载流程极其原理

vue的生命周期

父子组件生命周期的顺序

vue2.0响应式原理

vue3响应式相对于vue2的进步

三、浏览器部分

从页面输入一个url,到页面呈现,详细说明发生了什么?

浏览器缓存

tcp的三次握手和四次挥手

cookie,sessionStorage,localStorage

重绘和重排,以及其发生的条件

http请求和响应的一些问题

四、web安全部分

CSRF

XSS

sql注入

点击劫持

五、优化部分

高内聚,低耦合

减少请求次数

理解原理后,减少渲染或加载dom元素

利用缓存机制

vue优化

六、算法部分

时间和空间复杂度

多叉树求最大深度

判断数组中两整数之和是否等于某个整数

链表的中序遍历

两个单链表是否相交


一、js部分

  1. 箭头函数与普通函数的区别

    箭头函数的this是由箭头函数的外部函数决定的

    箭头函数不能作为构造函数,因为箭头函数的原型链在他这就断了,他没有prototype属性,没有办法链接他的实例的原型链

    箭头函数没有arguments参数,通过剩余参数语法获取到全部参数

    可通过排除参数(...args)=>{

            console.log(args)

    }

  2. Promise async和await

    Promise状态只改变一次

    Promise().then()返回一个新的期约示例。如果有返回,链式调用中then的参数为上一个then的返回值。更准确的理解是,then()的返回值会被Promise.resolve()包装,而接下来的链式then()的参数会取上一个resolve包装的。

    Promise.then(),.catch(),.finally()

    Promise.all(),

    三种返回

    1、所有resolve的数组。

    2、有一个rejected,则返回第一个reject(),后续的reject会被静默处理。

    3、有一个待定,则返回待定。有reject和pending则返回reject

    Promise.race()  对第一个状态改变的Promise进行处理,无论是哪个Promise 出现resolve或reject状态

    async await

    async 返回Promise

    await是暂停当前等待其他完成在执行

  3. js继承

     1.原型链继承

    function Person(name,age){
        this.name = name || '默认';
        this.age = age || '默认';
    }
    function Black(){
        this.type = 'Black';
    }
    Black.prototype = new Person()

    可影响原型对象的所有后代 

    缺点:

    无法实现多继承

    创建子类的实例时,无法向父类的构造函数传参

    来自原型对象的所有属性被后代共享

    2. 构造继承

    function Black(name,age){
        new Person().call(this,name,age);
        this.type = 'Black'
    }

    特点:

    可以在子类创建时,向父类构造函数传参

    子类实例就是子类实例

    父类构造函数原型的 改变不会影响子类

    可以实现多继承

    缺点:

    不继承父类的原型属性

    无法实现跨级继承

    3.实例继承

    function Black(){
        let instance = new Person();
        instance.type = 'Black';
        return instance
    }

    特点:

    在父类实例上创建属性

    缺点:不支持多继承

    4.拷贝继承?(我的理解这不算是继承,只能算是将其父类属性拷贝给子类)

    function Black(){
        let instance = new Person();
        for(let key in instance){
            Black.prototype[key] = instance[key];
        }
        this.type = 'Black';
    }

  4. 事件循环机制(Event Loop)

    无论是哪种说法,都在问一个问题,js是如何运行的

    先确定,js是单线程的。

    再确定,js先执行同步任务,再执行异步任务。

    然后梳理,单线程,意味着,无论有多少要处理的任务,无论时间长短,在前面任务未执行完,后面的任务都要等待其执行完毕。

    setTimeout就说明了这个问题

    setTimeout(fn,0)这个0不意味着立即执行,他会等待他前面的任务执行完,才会执行。

  5. js事件阶段和事件委托

    事件阶段可以理解为两个也可以理解为三个。看怎么好理解

    捕获阶段

    从html逐级向下,直到找到目标元素

    目标阶段(可选)

    在目标元素上触发

    冒泡阶段

    从目标元素逐级向上,直到html,或遇到冒泡阻止函数。e.stopPropagation()

  6. js垃圾回收机制

    标记引用,如果引用不到则删除,从根开始标记
  7. 双等于‘==’引出的一系列违反常理的情况

    == 先转换为同类型,再判断

二、vue部分

  1. vue插件、指令、组件和过滤器

     一、插件:

    1.创建js文件,一般命名为vue-插件名.js

    2.定义插件内的install方法,第一个参数为vue对象,第二个参数为可选的选项对象。内部可自定义指令,方法属性等。

    (function(){
        var MyPlugin = {};
        MyPlugin.install = function(Vue,options){
            Vue.MyGlobalMethod = function(){
                //...逻辑
                console.log('注册全局属性或方法')
            }
            Vue.directive('my-direct',function(el, bind, vNode, oldNode){
                //...逻辑
                console.log('定义 自定义指令')
            });
            Vue.mixin({
                create(){
                    //...逻辑
                    console.log('定义全局组件')
                }
            })
            Vue.property.$method = function(methodOptions){
                //...逻辑
                console.log('定义实例方法')
            }
        }
        window.MyPlugin = MyPlugin;
    });
    
    //使用
    Vue.use(MyPlugin);
    //或者传参
    Vue.use(Mypulgin,{param:'xxx'})

    二、自定义指令

    钩子函数:

    1.bind:只调用一次,绑定元素时调用

    2.inserted:第一次插入父元素时调用

    3.update:VNode更新时调用,也可能更新之前。可比较Vnode和oldNode

    4.componentUpdated:Vnode及其子元素全部更新 时调用

    5.unbind:解绑时调用。

    钩子函数参数:

    el:绑定的元素,可用来直接操作DOM

    binding:一个对象,包含以下属性

            name:指令名,不包括v-

            value:指令值。例在v-my-directive='1+1'中 value=2

            oldValue: 指令的前一个值,仅在update和componentUpdated中使用。无论值是否改变都可用。

            expressions:字符串形式的指令表达式。例v-my-directive='1+1'表达式为'1+1'

           arg:传给指令的参数。例v-my-directive:foo。arg为foo

            modifiers:包含修饰符的对象。v-my-directive.foo.bar的修饰符对象为{foo:true,bar:true}

    vnode:Vue编译的虚拟节点

    oldVnode:上一个虚拟节点。仅在update和componentUpdated中使用。

    全局自定义指令:

    Vue.directive('my-direct',{
        bind:function(el,binding,vNode,oldNode){
            //...逻辑
            console.log('全局自定义指令');
        }
    })

    局部自定义指令:

    //定义在vue对象中
    directives:{
        my-direct:{
            bind:function(el){
                //...逻辑
                console.log('第一次绑定元素时调用')
            }
        }
    }
    

    三、自定义过滤器

    全局过滤器

    Vue.filter('filterA', function(value){
        //...逻辑
        console.log('我是全局过滤器filterA')
    });
    Vue.filter('filterB', function(value, arg1, arg2){
        //...逻辑
        console.log('我是带参数的全局过滤器filterB')
    })

    局部过滤器

    filters:{
        filterA:function(value){
            //...逻辑
            console.log('我是局部过滤器filterA')
        },
        filterC:function(value,arg1,arg2){
            //...逻辑
            console.log('我是带参数的局部过滤器filterC')
        },
    }

    在vue中使用过滤器时,可以在{{}}中,也可在v-bind中

    <!-- 在双花括号中 -->
    {{ message | capitalize }}
    
    <!-- 在双花括号中 message为第一个参数,arg1是第二个参数,arg3是第三个参数-->
    {{ message | capitalize(arg1,arg2) }}
    
    <!-- 在 `v-bind` 中 -->
    <div v-bind:id="rawId | formatId"></div>

    如果全局过滤器和局部过滤器重名时,使用局部过滤器

    3.x取消了过滤器,建议计算属性替代

  2. vue组件通信方式

    1.props

    2.$emit

    3.provide/inject

    4.$parent/$children

    5.全局($on/$emit)

    $on绑定全局事件,$emit调用事件

    6.$attrs/$listeners

    7.vuex

  3. vuex的使用、加载流程极其原理

    vuex是全局状态管理工具

    什么是状态管理模式?

    当我们多个组件共用一个状态,而vue的兄弟组件通信是个问题,这时候就需要将这个状态进行全局共享,将其注册到window中。

    vuex的5个基本对象?

    state、getter、mutation、action、module

    vuex的store是什么?与5个基本对象有什么关系

    注册在全局的一个变量,他是整个状态管理对象。

    5个基本对象是定义在store中的

    vuex中state的作用是什么?

    vuex中的getter、mutation、以及action实际操作的都是state,state就是一个状态。

    要理解vuex的加载流程。

    vueComponents->dispatch action->commit mutation->state(getter是计算属性,存储缓存中,计算state)

    vuex中mutation和action有什么异同?

    mutation是同步的,action是可以执行异步操作的。

    并且action实际执行的是mutation。action相当于在mutation外包了一层。mutation执行的是state

    项目中使用vuex需要遵循什么原则?

    如果需要在组件外部需要管理状态,则可以使用vuex。

    vuex的实现原理?

    通过vue.mixin进行全局注册,在beforeCreate生命周期注册到vue.prototype中

  4. vue的生命周期

  5. 父子组件生命周期的顺序

  6. vue2.0响应式原理

  7. vue3响应式相对于vue2的进步

    1.可以深度监听数组。
    2.更主要的时proxy是劫持监听整个对象,对整个对象架设拦截。而费某一个属性。

三、浏览器部分

  1. 从页面输入一个url,到页面呈现,详细说明发生了什么?

  2. 浏览器缓存

    浏览器分为强缓存和对比缓存。可同时存在。

    强缓存:

    客户端 ----->未超时--->读取缓存数据库。

    客户端------>超时----->请求服务端------>获取数据,放入缓存

    强制缓存:cache-control

    cache-control:no-cache。每次请求都需向服务端验证。

    cache-control:public。

    对比缓存:Last-Modified、ETag

    第一次发送请求,请求服务端,服务端给ETag为了下次验证是否修改。Last-Modified,最后的修改时间.code 200

    第二次发送请求,未超时,则直接调取缓存数据库。code:200

    第三次发送请求,超时,发送请求到服务端,资源未修改,通知客户端调取缓存数据库。状态码304

  3. tcp的三次握手和四次挥手

  4. cookie,sessionStorage,localStorage

    cookie会被携带在同源http请求中,cookie大小限制4K,在设置的过期时间内一直有效
    session Storage  浏览器关闭数据删除,大小一般在5M,或更大
    local Storage 存储持久化数据,浏览器关闭不会删除,大小同sessionStorage
    localStorage和sessionStorage不会将信息在http请求中携带
  5. 重绘和重排,以及其发生的条件

  6. http请求和响应的一些问题

四、web安全部分

  1. CSRF

  2. XSS

    1.富文本编辑器过滤script标签
    2.用户图片上传 禁止使用用户填写地址
    3.在setCokkIE时,代上httponly字段,阻止JavaScript获取cookie
    4.对用户的输入进行转义,<>转义为&lt;&gt;
    5.使用innerText取代innerHTML,使用 v-text取代v-html,禁止使用eval()执行JavaScript
  3. sql注入

  4. 点击劫持

五、优化部分

  1. 高内聚,低耦合

    css 优化  雪碧图(通过webpack配置spriteSmith)
    js优化  请求外部  封装sdk 放cdn  减少重绘 减少闭包 减少dom节点更改
    h5 尽量避免多层嵌套   增加title keyword利于seo 
    公共组件  公共方法  公共样式抽取
  2. 减少请求次数

  3. 理解原理后,减少渲染或加载dom元素

  4. 利用缓存机制

  5. vue优化

     一、代码层面

    1.v-if,v-show

    频繁变动使用v-show,不频繁使用v-if。原因:v-if只有为true才会渲染,v-show总是渲染

    2.v-for,v-if

    同时存在时,v-for优先级更高。因此会先加载所有,才生效v-if。可以在computed中对数组进行过滤,filter只有通过定义函数测试的才会返回给数组

    Array.user.filter((result)=>result)

    3.图片懒加载vue-lazy

    4.路由懒加载

    import page = ()=>'' 更快的首屏。缺点,路由加载变慢

    5.ssr服务端渲染 预渲染    seo和更快的首屏

    6.长列表取消监听.不会发生改变,无需响应式

    this.key = Object.freeze(obj)

    7.watch,computed

    computed存入缓存,并依赖于其他属性。其他属性变动后,第一次使用时才会改变

    watch 可以理解为监听,某个值一旦发生改变,将要做的操作,无返回

    8.对绑定事件进行移除

    beforeDestroy(){

            el.removeEventListener('click',this.click,false)

    }

    9.第三方插件的按需引入

    安装babel-plugin-component

    npm i babel-plugin-component --D

    配置.babelrc文件(babel.config.js)

    {
      "presets": [["es2015", { "modules": false }]],
      "plugins": [
        [
          "component",
          {
            "libraryName": "element-ui",
            "styleLibraryName": "theme-chalk"
          }
        ]
      ]
    }
    

    main.js引入

    import Vue from 'vue';
    import { Button, Select } from 'element-ui';
    
     Vue.use(Button)
     Vue.use(Select)
    

    二、传统web优化

    1.缓存优化

    采取强制缓存和对比缓存,减少请求。

    2.文件压缩,gzip

    3.使用cdn

    4.通过chrom工具查看耗时,发现代码问题

    三、webpack优化

    1.大图片压缩

    image-webpack-loader    限制limit,超过limit压缩

六、算法部分

  1. 时间和空间复杂度

  2. 多叉树求最大深度

  3. 判断数组中两整数之和是否等于某个整数

  4. 链表的中序遍历

  5. 两个单链表是否相交

<think>好的,我需要帮用户制定一个为期的详细学习计划,涵盖提供的知识点。首先,用户提供的知识点涉及项目管理、职业发展、技术学习等多个方面,但具体知识点在问题中没有明确列出,可能是指用户之前提到的引用内容中的相关主题。 首先,我需要确认用户的具体需求。用户提到“已有的知识点”,可能是指之前问题中涉及的引用内容,例如引用[1]到[5]中的内容,包括项目管理中的风险应对、采购经验总结、职业发展(如技术深度与广度、财务自由、进大厂)、简历优化、以及学术研究等。但用户现在希望制定学习计划,可能这些引用中的知识点是需要涵盖的,还是用户有其他未列出的知识点?这里可能需要进一步澄清,但根据用户当前的问题描述,可能假设这些引用中的主题是需要覆盖的。 接下来,制定(约8周)的计划,需要合理分配时间,确保每个主题都有足够的学习和练习时间。考虑到用户可能希望兼顾理论与实践,计划应包括理论学习、实践应用、复习与总结。 可能需要将各主题按优先级排序。例如,项目管理(引用1、2)和职业发展(引用3、4)可能更偏向于实践应用,而技术学习(如代码能力提升、岗位推荐)和学术研究(引用5)可能属于技能提升部分。此外,用户提到“代码能力不强”,可能需要加强编程实践。 需要确保计划的结构清晰,每周有明确的学习目标,并留有复习和调整的空间。同时,建议用户每天投入固定时间,例如每天2-3小时,周末更多时间用于项目实践或复习。 可能遇到的问题:时间分配是否合理?各主题的深度是否足够?是否需要参考资料或具体的学习资源?用户可能需要推荐书籍、在线课程或实践项目来辅助学习。 最后,要检查是否符合用户的要求:结构清晰、步骤详细、真实可靠,并生成相关问题。同时,注意使用中文回答,数学公式的格式正确,但当前问题可能不涉及数学内容,所以可能不需要应用该格式。</think>### 详细学习计划制定指南 根据知识点的类型和复杂度,建议按以下步骤规划: --- #### **第一步:知识分类与优先级排序** 1. **梳理知识点** - 将待学内容分为 **理论型**(如算法原理、数学公式)和 **实践型**(如编程实现、项目管理工具) - 例如: - 理论型:快速排序的时间复杂度分析(需数学推导 $O(n \log n)$) - 实践型:Python实现快速排序代码(需调试与优化) 2. **设定优先级** - 按 **基础→进阶→应用** 顺序排列 - 参考:先掌握算法基础,再学习项目管理中的风险应对方法[^1] --- #### **第二步:时间分配与阶段目标** **以8周为例,分4个阶段:** | 阶段 | 目标 | 时间分配 | |--------|----------------------------------------------------------------------|---------------| | **1-2周** | 掌握核心理论与工具基础 | 每天2-3小时 | | **3-4周** | 实践项目开发(如编写排序算法、模拟采购流程[^2]) | 每天3-4小时 | | **5-6周** | 职业能力提升(简历优化[^4]、技术深度与广度规划[^3]) | 每周专题学习 | | **7-8周** | 综合应用与复盘(模拟面试、项目总结) | 高强度实战 | --- #### **第三步:具体执行模板(以计算机科学为例)** **第1周:算法与数据结构基础** - **周一至周三** - 学习排序算法理论:快速排序、归并排序的原理及数学证明(如推导 $T(n)=2T(n/2)+O(n)$) - 配套练习:手写伪代码,分析时间复杂度 - **周四至周五** - 用Python实现快速排序,对比不同基准选择策略的性能差异 ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] # 优化基准选择 left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` - **周末** - 总结算法优化方法(如三向切分、小数组切换插入排序) **第2周:项目管理实践** - 学习风险应对策略(如引用[1]中的延迟交付应对方法) - 使用甘特图工具(如Microsoft Project)模拟项目进度调整 --- #### **第四步:动态调整与验证** 1. **每周复盘** - 通过LeetCode周赛检验算法学习效果 - 使用模拟面试评估职业能力提升进度 2. **灵活调整** - 若某模块进度滞后(如数学推导困难),可增加专项训练时间 ---
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值