• 【每日前端面经】2023-02-23


    题目来源: 牛客

    企业级开发整体流程有哪些

    1. 项目启动
    2. 需求调研->需求文档
    3. 系统设计->设计文档
    4. 程序开发->开发文档
    5. BUG测试->测试文档
    6. 验收
    7. 维护

    遇到技术难题怎么办

    1. 分析可能出现的原因
    2. 查找搜索引擎
    3. 寻问文心一言等对话模型
    4. 打断点,寻找问题复现
    5. 再一次归纳分析
    6. 询问师傅或更高级的工程师

    常用的设计模式

    • 工厂模式
      • 简单工厂模式
      • 抽象工厂模式
    • 单例模式
      • 懒汉单例
      • 饿汉单例
    • 装饰器模式
    • 策略模式
    • 代理模式
    • 观察者模式
    • 发布订阅模式

    单例模式具体实现和原理

    单例模式涉及单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建

    // 懒汉单例
    class LazySingleInstance {
        private constructor {}
    
        private static instance: LazySingleInstance;
        static getInstance() {
            if (!LazySingleInstance.instance) {
                return LazySingleInstance.instance;
            }
            LazySingleInstance.instance = new LazySingleInstance();
            return LazySingleInstance.instance;    
        }
    }
    
    // 饿汉单例
    class HungrySingleInstance {
        private constructor {}
    
        private static instance = new HungrySingleInstance();
        static getInstance() {
            return HungrySingleInstance.instance;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    发布订阅模式如何实现

    class Event {
        constructor() { this.events = {} }
    
        // 订阅
        on(type, callback) {
            if (this.events[type] === undefined) this.events[type] = [];
            this.events[type].push({ listener: callback });
        }
    
        // 发布
        emit(type. args) {
            this.events[type].forEach(ele => {
                ele.listener(args)
            });
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    发布订阅模式存在的风险

    最大的缺点是松耦合,需要中间的代理,增加了系统的复杂度

    TS泛型

    泛型的特点就是带有“类型参数”

    function getFirst<T>(arr: T[]): T {
        return arr[0];
    }
    
    • 1
    • 2
    • 3

    什么情况用枚举类型

    用于组合一系列常量从而实现共享复用

    interface递归结构如何处理

    interface可以在结构定义中引用interface定义的接口

    典型ES6新特性

    • 展开运算符
    • 剩余参数
    • 字符串插值
    • 属性简写
    • 对象方法简写
    • 解构赋值
    • 数组新方法
    • Promise
    • 模块化

    async await和promise什么情况下用哪种

    async/await适用于异步请求相互独立的情况
    Promise适用于同时进行多个异步请求的情况

    promise.all其中一个接口挂了有什么后果

    如果有一个接口挂了,那么会立刻将其reject掉,不再等待其他异步操作执行

    async await接口挂了怎么处理

    会直接抛出错误,可以用try/catch捕获

    promise对象的本质

    Promise是一个对象,代表了一个异步操作的最终完成或者失败,本质上Promise是一个函数返回的对象,可以在上面绑定回调函数,就不需要一开始把回调函数作为参数传入

    promise对象里面做了什么事

    promise封装AJAX怎么用

    const ajax = (url) => {
        return new Promise((resolve, reject) => {
            const req = new XHLHttpRequest();
            req.open("GET", url, true);
            req.onload = () => req.status === 200 ? resolve(req.responseText) : reject(new Error(req.statusText));
            request.onerror = () => reject(new Error(req.statusText));
            request.send();
        });
    }
    
    const url = "/ajax/get";
    ajax(url).then(value => console.log(value)).catch(error => console.log(error));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    构造函数、实例、原型三者关系

    每一个构造函数有一个prototype指向其原型对象
    每一个原型对象有一个constructor指向其构造函数
    每一个实例对象有一个__proto__指向其原型对象

    字符串的constructor是什么

    字符串的构造函数是String。当String作为构造函数使用时,会创建一个String对象而非原始数据类型;而被作为函数调用时,会将参数强制转换成一个字符串原始类型

    类的私有成员和共享成员

    • public: 默认值,没有访问限制
    • protected: 只允许在类的内部以及直接子类中访问
    • private: 只允许在类的内部访问
    • static: 静态变量,与实例无关

    用面对对象思想抽象组件

    bind、apply和call的区别

    call和apply的区别在于apply的传参使用的是数组
    call和bind的区别在于bind不会离开调用函数

    数组操作方法里比较方便匹配是什么API

    Array.find

    遍历数组里面返回新的数据结构

    • for
    • while
    • for-in
    • for-of
    • forEach
    • map

    什么情况下用不用=

    绝大多数场合可以直接使用===,只有检测是否为null/undefined时可以使用==

    数据类型判断

    • 基本数据类型:typeof
    • 通过对象类型判断: instance of
    • 根据原型链判断: prototype
    • 根据构造器判断: constructor

    为什么Object.prototype.toString().call(obj)需要用call,apply可以么

    set和map生成的数据怎么转数组

    使用Array.from即可

    webpack怎么处理各种loader和plugin以及webpack的生命周期

    loader就是一个函数,接受原始资源作为参数,输出进行转换后的内容
    plugin会在webpack生命周期中监听事件,并在合适的时机改变输出结果

    • beforeRun: 读取配置之前
    • run: 开始编译
    • watchRun
    • beforeCompile: 使用webpack-dev-server时会调用
    • compile: 开始编译时
    • thisCompilation: 创建新的Compilation对象时
    • compilation: 生成新的Compilation对象时
    • emit: 生成资源之前
    • afterEmit: 生成资源之后
    • done: 编译完成时
    • assetEmitted: 所有资源打包完毕后

    介绍广度优先遍历和深度优先遍历的特性和区别

    广度优先遍历

    特点是回放。

    1. 从图中某顶点v出发,在访问了v之后依次访问v的各个未访问的邻接点
    2. 然后分别从这些邻接点出发依次访问它们的邻接点,并使得先被访问的顶点的邻接点先于后被访问的顶点的邻接点,直到图中所有已被访问顶点的邻接点都被访问到
    3. 如果此时图中尚有顶点渭北访问,则需要另选一个未曾被访问过的顶点作为新的起始点,重复上述过程,直到图中所有顶点都被访问到为止

    深度优先遍历

    特点在于回溯

    1. 假设初始状态是图中所有顶点均未被访问
    2. 从某个顶点触发,然后一次从它的各个未被访问的临界点出发深度优先搜索遍历图,直至图中所有和初始点有路径相通的顶点都被访问到
      3 若此时尚有未被访问到的顶点,那么则另选一个未被访问的初始点作为起点,重复上述过程

    算法:深度优先遍历和广度优先遍历
    企业的软件项目开发你一定要知道的那些流程!
    程序员遇到技术问题该怎么解
    如何理解这6种常见设计模式?
    菜鸟教程
    如何使用js来实现一个发布订阅模式
    设计模式之发布订阅模式—— 一文搞懂发布订阅模式
    阮一峰TypeScripe教程
    TypeScript字符串枚举,以及何时和如何使用它们
    9个常用ES6特性归纳(一般用这些就够了)
    Promise和async/await的两种常用的实际应用场景
    async,await做错误处理,每请求一个接口都要try,catch一下吗?
    JavaScript——promise(一)基础篇
    5分钟带你搞懂 构造函数、原型对象、实例对象、原型、原型链
    MDN官方文档
    ts class中的成员可见性(public,protected,private,static)
    手写Webpack生命周期及其实现过程
    彻底掌握 Webpack 中 Loader 和 Plugin 的机制
    js判断数据类型常用的6种方法

    新手发文,礼貌求关❤️
    
    • 1
  • 相关阅读:
    【数据挖掘竞赛】零基础入门数据挖掘-二手汽车价格预测
    山东大学数字图像处理实验(五)
    5_会话管理实现登录功能
    Windows安装多Java版本快速切换
    《代码随想录》三刷,与诸君共勉,秋招见!
    SystemUI状态栏
    Mac电脑怎么使用NTFS磁盘管理器 NTFS磁盘详细使用教程
    javascrip非标准 json格式转换为标准格式
    数据抓取使用爬虫ip常见问题解决方法
    Linux安装PHP(最新版)
  • 原文地址:https://blog.csdn.net/m0_66681776/article/details/136265435