GithubHelp home page GithubHelp logo

blog's People

Contributors

cristinazhou avatar

Stargazers

 avatar

Watchers

 avatar  avatar

blog's Issues

字节生活服务面经 一面

1、typeof 和 instanceof 区别, 判断数组的方法有哪些?

typeof 来判断number, string, object, boolean, function, undefined, symbol 这七种类型
js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息 ,typeof 在判断 null 的时候就出现问题了,由于 null 的所有机器码均为0,因此直接被当做了对象来看待。

数组判断: Object.prototype.toString.call()、 a instanceof Array
Array.isArray是ES5标准中增加的方法,部分比较老的浏览器可能会有兼容问题,重新封装的方法如下

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

2、自己实现一个instanceof

function new_instance_of(left, right) { 
    let rightProto = right.prototype; // 取右表达式的 prototype 值
    left = left.__proto__; // 取左表达式的__proto__值
    while (true) {
    	if (left === null) {
            return false;	
        }
        if (left === rightProto) {
            return true;	
        } 
        left = left.__proto__ 
    }
}

3、基础类型和引用类型的区别?

基本类型的值是不可变的,基本类型的变量是存放在栈区的;

引用类型的值是可变的,引用类型的存储需要内存的栈区和堆区(堆区是指内存里的堆内存)共同完成,栈区内存保存变量标识符和指向堆内存中该对象的指针,引用类型的比较是引用的比较;

4、实现一个对象的深拷贝?

5、React 组件通信的方法有哪些?

父组件向子组件通信:props、 ref ,子组件向父组件通信 : 回调函数,跨层级 复杂状态管理: Context、redux、mobx;

6、React 的setState是同步的还是异步的?

在react事件触发的setState,不会同步更新this.state(通过addEventListener或者setTimeout/setInterval)会同步执行this.state

原理:在React的setState函数实现中,会根据一个变量isBatchingUpdates判断是直接更新this.state还是放到队列中回头再说,而isBatchingUpdates默认是false,也就表示setState会同步更新this.state,但是,有一个函数batchedUpdates,这个函数会把isBatchingUpdates修改为true,而当React在调用事件处理函数之前就会调用这个batchedUpdates,造成的后果,就是由React控制的事件处理过程setState不会同步更新this.state(不是真正的同步异步)

面试官追问为什么这么做 ?😯

我: react 事件中方便控制,异步setState可以 减少虚拟dom的对比,以及重复渲染的开销(这部分需要再深入研究下)

7、React 的 class 组件和函数组件的区别 ?

8、算法: 最长递增子序列 (动态规划)

输入:nums = [10,9,2,5,3,7,101,18]
输出:4
解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。

var lengthOfLIS = function(nums) {
    const len = nums.length;
    if (len < 2) {
        return len;
    }
let max = 0;
const dp = new Array(len).fill(1); // 以i为结尾的最⻓⼦串的⻓度
    for (let i = 1; i< len; i++) {
        for (let j = 0; j < i; j++) {
            if (nums[i] > nums[j]) {
                dp[i] = Math.max(dp[j] + 1, dp[i]);
            }
        }
    max = Math.max(dp[i], max);
    }
return max;

};

9、模板字符串的解析

const template = 'I'm ${name}, i love ${city}.'
const context = {name: 'coder',city: 'shanghai'}
处理后结果:I'm coder, i love shanghai.  (写的时候没用正则,硬拆字符串弄出来的 -_-||)

function parse_str(template, context) {
      return template.replace(/\$\{(.+?)\}/g, (match, key) => context[key]);
 }

//  .*? 是正则固定搭配用法,表示非贪婪匹配模式,尽可能匹配少的,

算法

10、快排

最小K个数
输入: arr = [1,3,5,7,2,4,6,8], k = 4
输出: [1,2,3,4]
var smallestK = function(arr, k) {
    if (k >= arr.length) {
        return arr;
    }
    quickSort(arr, 0, arr.length - 1, k);
    return arr.slice(0, k);
};

function quickSort(arr, start, end, k) {
    if (start > k || start >= end) {
        return ;
    }
    let left = start;
    let right = end;
    let mid = arr[left];
    while(left < right) {
        while(left < right && arr[right] >= mid) {
            right--;
        }
        if (left < right) {
            arr[left++] = arr[right];
        }
        while(left < right && arr[left] <= mid) {
            left++;
        }
        if (left < right) {
            arr[right--] = arr[left];
        }
    }
    arr[left] = mid;
    if (left === k) {
        return ;
    }
    quickSort(arr, start, left - 1, k);
    quickSort(arr, left + 1, end, k);
}

学习资料整理

webpack5

  1. 简单描述(基础篇)
    新一代构建工具对比
    webpack5 上手测评
    ESBuild
    webpack5 长效缓存
    vite原理解析

多段框架 对比

Taro 架构构析 (1):多端框架分析,Taro WePY uni-app 对比

服务端渲染

前端监控

深入浅出前端监控

nodejs

基础知识
nodejs 如何跑起来

Canvas 优化

得物canvas优化
canvas技巧
canvas 表格绘制
浅谈 Canvas 渲染引擎

框架 React

搞懂 useState 和 useEffect 的实现原理
Qwik-前端性能终极方案

Typescript

typescript handbook
深入理解Typescript
TS 类型挑战通关手册
ts官网
巧用ts
Typescript 最佳实践

包管理

pnpm文档

Websocket

websocket 可以玩儿出什么花 ?

设计模式

前端工程中的设计模式应用

其他

Puppeteer 能做什么
官方称:“Most things that you can do manually in the browser can be done using Puppeteer”,那么具体可以做些什么呢?

  • 网页截图或者生成 PDF

  • 爬取 SPA 或 SSR 网站

  • UI 自动化测试,模拟表单提交,键盘输入,点击等行为

  • 捕获网站的时间线,帮助诊断性能问题

  • 创建一个最新的自动化测试环境,使用最新的 js 和最新的 Chrome 浏览器运行测试用例

  • 测试 Chrome 扩展程序

别人的面经

level1
level1

edwardnie

算法整理

解题思路:

leetcode题目:

Fisher-Yates洗牌算法的一个变种是KnuthShuffle每次从未处理的数组中随机取一个元素,然后把该元素放到数组的尾部,即数组的尾部放的就是已经处理过的元素,这是一种原地打乱的算法,每个元素随机概率也相等,时间复杂度从Fisher算法的O(n2)提升到了O(n)
1.选取数组(长度n)中最后一个元素(arr[length-1]),将
其与n个元素中的任意一个交换,此时最后一个元素
已经确定;
2.选取倒数第二个元素(arrflength-2]),将其与n-1个元
素中的任意一个交换;
3.重复第12步,直到剩下1个元素为止
function shuffle( arr ) {
var length=arr.Length, temp, random;
while(0 != length) {
    random=Math.floor(Math.random() * length)
    length--;
    // swap
    temp=arr[lengthl;
    arr[lengthl=arr[random]
    arr[random]=temp;
    return arr;
}

10月面经

几种常见的SPA首屏优化方式

减少HTTP请求次数
1、http 强缓存

提高HTTP请求得响应速度
1、CDN
2、DNS Prefetch
3、http2

减小资源大小
1、 代码压缩
2、图片压缩
3、代码拆分

优化资源加载时机
1、按需加载
2、懒加载
3、预加载

优化资源加载方式
1、客户端内H5 可考虑使用离线包
2、内容直出SSR


某书

  • 解析url 的参数 (decodeURIComponent 处理中文解析 )
let url = https://github.com/cristinazhou/Blog/issues/5?a=%E5%8C%97%E4%BA%AC&b=1&b=3&c

解析成 
object = {

a: '北京',// 中文解析
b: [ 1, 3],   // 相同参数解析为数组
c: true   // 没有值的参数 赋值为true
}


function parseURL(url) {
  const queryIndex = url.indexOf('?');
  const queryString = url.slice(queryIndex + 1);
  
  const params = new URLSearchParams(queryString);
  const object = {};

  for (const [key, value] of params.entries()) {
    if (value === '') {
      object[key] = true;
    } else {
      if (object.hasOwnProperty(key)) {
        if (Array.isArray(object[key])) {
          object[key].push(value);
        } else {
          object[key] = [object[key], value];
        }
      } else {
        object[key] = decodeURIComponent(value);
      }
    }
  }

  return object;
}

// 示例用法:
const url = 'https://github.com/cristinazhou/Blog/issues/5?a=%E5%8C%97%E4%BA%AC&b=1&b=3&c';
const parsedObject = parseURL(url);
console.log(parsedObject);
  • redux middleware的执行顺序

  • 低代码 (重点 需要再组织组织,面试官真是离谱 明明说组件嵌套怎么做的 、自己想要的回答是什么 富文本编辑 notion 飞书………… 搞不懂在说什么被气死……😤 )

think: (面试 避免紧张情绪 ,对方不是高高在上的,有时问问题 真问不到点上。。。)

Koa 框架学习整理

概述:

Koa 是基于Node.js 的HTTP中间件框架,Egg.js (BFF框架)就是基于Koa实现的。

应用程序:
Koa 应用程序是 一个包含一组中间件函数的对象。
Koa应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行(先进后出)

当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。

Q1:源码理解 koa中 合并中间件、代理对象属性的代码实现 ?

参考:
Koa官方文档

学习笔记-日更

2022.10.13 (被隔离居家办公的一天 时间相对自由一些)

知识点

1、vue3 composition api 与 options api 对比
2、websocket 相关(心跳机制)
3、redux middleware怎么应用的 Redux通关简洁攻略

middleware: dispatch的高阶函数封装,由applyMiddleware把原dispatch替换为包含middleware链式调用的实现。
applyMiddleware:是官方实现的一个storeEnhance,用于给redux提供插件能力,支持各种不同的Action。

// middleware 函数签名
type MiddlewareAPI = { dispatch: Dispatch, getState: () => State } 
type Middleware = (api: MiddlewareAPI) => (next: Dispatch) => Dispatch 
// 最外层函数的作用是接收middlewareApi ,给middleware提供store 的部分api,它返回的函数参与compose,以实现middleware的链式调用。

export default function applyMiddleware(...middlewares) {
    return (createStore) =>{             
            // 初始化store,拿到dispatch             
            const store = createStore(reducer, preloadedState)             
            // 不允许在middlware中调用dispath             
            let dispatch: Dispatch = () => {                 
                throw new Error(                     
                'Dispatching while constructing your middleware is not allowed. ' +                     'Other middleware would not be applied to this dispatch.'                 
                )             
            }             
            const middlewareAPI: MiddlewareAPI = {
                getState: store.getState,                 
                dispatch: (action, ...args) => dispatch(action, ...args)
            }            
            // 把api注入middlware             
            const chain = middlewares.map(middleware => middleware(middlewareAPI))                 // 重点理解
            // compose后传入dispatch,生成一个新的经过层层包装的dispath调用链
            dispatch = compose<typeof dispatch>(...chain)(store.dispatch)
            // 替换掉dispath,返回
            return {                 
                ...store,                 
                dispatch             
            }         
        } 
} 

storeEnhancer
从函数签名可以看出是createStore的高阶函数封装。
type StoreEnhancer = (next: StoreCreator) => StoreCreator;
CreateStore 入参中只接受一个storeEnhancer ,如果需要传入多个,则用compose把他们组合起来,关于高阶函数组合的执行方式下文中的Redux Utils - compose有说明,这对理解下面middleware 是如何链式调用的至关重要,故请先看那一部分。
compose(组合)是函数式编程范式中经常用到的一种处理,它创建一个从右到左的数据流,右边函数执行的结果作为参数传入左边。

export default function compose(...funcs) {
    if (funcs.length === 0) {
        return (arg) => arg
    }
    if (funcs.length === 1) {
        return funcs[0]
    }
    // 简单直接的compose
    return funcs.reduce(
        (a, b) =>
            (...args: any) =>
                a(b(...args))
    )
}

高阶函数的应用是非常值得借鉴的一个插件体系构建方式,不是直接设定生命周期,而是直接给予核心函数一次高阶封装,然后内部依赖compose完成链式调用.

系统设计
1、低代码设计**
对低代码搭建的理解

低代码不仅仅包括 “能写代码”,主要具备如下四个特性:物料接入、编排能力、渲染能力、出码能力。

通用搭建引擎要能够接入通用物料,即组件自身不关心搭建环境,就可以被搭建平台所使用。

这需要搭建平台本身不对组件代码实现有入侵,可以对组件暴露的 props 做完全控制,要做到自动识别组件有哪些 props 变量,并根据类型自动推荐编辑表单类型。

除了简单的文本、数字、下拉框等编辑器 Setter 之外,还有如下几种复杂编辑器:

回调函数编辑器。
Node 节点编辑器。
文本国际化编辑器。
表达式编辑器。
积木式搭建和富文本搭建存在哪些差异,除了富文本更倾向于记录静态内容外,还有哪些差异,两者是否可以结合?
从前端角度来看,富文本本质上是对一个 div 进行 contenteditable 申明,那么一个应用可以整体是 contenteditable 的,也可以局部几个区块是,这种代码层面的自由度体现在搭建上就是积木式搭建可以与富文本搭建自由结合。
image

2、富文本编辑 notion 飞书,设计实现难点是什么 ? 面试官 提的富文本编辑中的blot 概念,当时完全没听懂
深入浅出富文本编辑器

摘要:如果业务中需要拓展一些功能卡片,如飞书文档的各种应用,可通过拓展 blot + 编写对应的组件来实现。此外还能够通过编写相应平台的解析器在非 web 场景的展示,轻松实现内容跨平台渲染。

quilljs

coding:

1、快排 (原地排序)
2、洗牌算法
3、url 解析

🤔 自律 自信 自由

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.