跳至主要內容
实现async-await

此次我们来实现一个 async await 内部实现
实际上 async 就是生成器的语法糖,await 就是 then 的语法糖,
平常我们使用的过程中

示例

const getDate = () =>
  new Promise((resolve, reject) => setTimeout(() => resolve("data"), 1000));
async function test() {
  const res = await getDate();
  console.log("data:", res);
  const res2 = await getDate();
  console.log("data2:", res2);
}
// 输出
//data:data
//data2:data

ZiHao...大约 3 分钟记录技术实践 -
排序算法汇总

归并排序

排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。
归并排序采用的是分治思想。

分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题来解决。小的子问题解决了,大问题也就解决了。

const mergeSort = (arr) => {
  let len = arr.length;
  if (len < 2) {
    return arr;
  }
  let middle = Math.floor(len / 2);
  let left = arr.slice(0, middle);
  let right = arr.slice(middle);
  return merge(mergeSort(left), mergeSort(right));
};
//
const merge = (left, right) => {
  const result = [];
  while (left.length && right.length) {
    if (left[0] <= right[0]) {
      result.push(left.shift());
    } else {
      result.push(right.shift());
    }
  }
  while (left.length) {
    result.push(left.shift());
  }
  while (right.length) {
    result.push(right.shift());
  }
  return result;
};
const arr = [3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48];
console.time("归并排序耗时");
console.log("arr :", mergeSort(arr));
console.timeEnd("归并排序耗时"); // 大约 8ms

ZiHao...大约 2 分钟记录算法
Vercel部署个人博客+白嫖个人域名

vercel

(补充:vercel 在国内已被墙,一个悲伤的消息,网站只能科学上网查看,或者自己绑定域名)

测试

使用vuepress+github 托管

我们可以使用 vercel 进行部署,vercel 和 github actions 很相似,都是通过将博客的所有必须文件(包括 package.json,docs 等)push 到 github 的某个仓库仓库中,然后在 vercel 中创建一个项目,导入此仓库,之后的一切就交给 vercel 去做了
并且 vercel 还能够自动部署,如果你 commit 了新的内容,vercel 监测到有新的 commit 之后,便会重新运行 npm run build 命令进行部署,你只需要将新的修改,从本地 push 到 github 便可以了(比如新增一篇文章),而不需要像 github pages,服务器部署那样,每次新增文章,都需要在本地运行 npm run build,然后再将 docs/.vuepress/dist 目录中的所有文件,上传到 github 或者服务器中才能完成博客新内容的改变


ZiHao...大约 3 分钟记录博客
手写一些函数
  1. 二维数组斜向打印
(function () {
  function printMaxit(arr: number[][]) {
    let row = arr.length; //行 x
    let conlum = arr[0].length; //列 y
    let res: any = [];
    //左上角  从0开始打印到conlum-1;
    for (let k = 0; k < conlum; k++) {
      for (let i = 0, j = k; i < row && j >= 0; i++, j--) {
        res.push(arr[i][j]);
      }
    }
    //右下角
    for (let k = 1; k < row; k++) {
      for (let i = k, j = row; i < row && j >= 0; i++, j--) {
        res.push(arr[i][j]);
      }
    }
    return res;
  }
  const matrix2 = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
  ];
  console.log(printMaxit(matrix2));
  // 输出: [1, 5, 2, 9, 6, 3, 10, 7, 4, 11, 8, 12]
})();

ZiHao...大约 4 分钟记录javascript
electron入门

#1. 简介

  • 官网
  • Electron 是由 GitHub 众多开发者开发的一个开源项目,能够使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序

2. 五分钟快速上手

2.1 安装 electron

初始化 package.json 文件

  • npm init

ZiHao...大约 4 分钟记录electron
Ts配置文件and泛型

tsconfig.json 配置

{
  /* 编译路径
   **表示文件夹下的所有文件夹,
   *表示文件夹下的所有文件
   */
  "include": ["./src/**/*"],
  /* 排除路径 不参加编译的文件路径
    	默认值[”node_modules“,"bower_components","jspm_packages"]
    */
  "exclude": ["./hellow/**/*"]
}

ZiHao...大约 3 分钟记录Ts
随时切换node版本不是梦

nvm 介绍

在工作中,我们可能同时在进行 2 个或者多个不同的项目开发,每个项目的需求不同,进而不同项目必须依赖不同版本的 NodeJS 运行环境,这种情况下,对于维护多个版本的 node 将会是一件非常麻烦的事情,nvm 就是为解决这个问题而产生的,他可以方便的在同一台设备上进行多个 node 版本之间切换。

nvm 的下载和使用

安装包地址:https://github.com/coreybutler/nvm-windows/releases


ZiHao...大约 2 分钟记录nvm
手写Promise🧐简单版🚩
class MyPromise {
  constructor(executor) {
    // 初始化state为等待态
    this.state = "pending";
    // 成功的值
    this.value = undefined;
    // 失败的原因
    this.reason = undefined;
    let resolve = (value) => {
      // state改变,resolve调用就会失败
      if (this.state === "pending") {
        // resolve调用后,state转化为成功态
        this.state = "fulfilled";
        // 储存成功的值
        this.value = value;
      }
    };
    let reject = (reason) => {
      // state改变,reject调用就会失败
      if (this.state === "pending") {
        // reject调用后,state转化为失败态
        this.state = "rejected";
        // 储存失败的原因
        this.reason = reason;
      }
    };
    // 如果executor执行报错,直接执行reject
    try {
      executor(resolve, reject);
    } catch (err) {
      reject(err);
    }
  }
  then(onFulfilled, onRejected) {
    // 状态为fulfilled,执行onFulfilled,传入成功的值
    if (this.state === "fulfilled") {
      onFulfilled(this.value);
    }
    // 状态为rejected,执行onRejected,传入失败的原因
    if (this.state === "rejected") {
      onRejected(this.reason);
    }
  }
}

ZiHao...小于 1 分钟记录javascript
浏览器如何渲染的

面试题

浏览器是如何渲染页面的?

当浏览器的网络线程收到 HTML 文档后,会产生一个渲染任务,并将其传递给渲染主线程的消息队列。

在事件循环机制的作用下,渲染主线程取出消息队列中的渲染任务,开启渲染流程。


整个渲染流程分为多个阶段,分别是: HTML 解析、样式计算、布局、分层、绘制、分块、光栅化、画

每个阶段都有明确的输入输出,上一个阶段的输出会成为下一个阶段的输入。

这样,整个渲染流程就形成了一套组织严密的生产流水线。


渲染的第一步是解析 HTML


ZiHao...大约 5 分钟记录javascript
JS事件循环

用简单的流程解释事件循环

在了解什么是事件循环之前我们应该需要先行了解javascript是一个单线程语言JavaScript的事件分类;

JavaScript 是一个单线程语言

什么是单线程。举个例子:这就好像食堂打饭,需要排队,如果只有一个窗口可以进行打饭,那么就可以看作是单线程,如果有好多个窗口可以进行打饭,这就是多线程
同理,javascript中的所有任务都只有一条线程在处理。

显然这种机制会造成很多问题,如果一个任务卡死,那么整个都不能运行了,
或者其中有一个任务执行的很慢,那么后面所有的任务都会延迟执行,所以 JS 有了两个任务分类[同步任务]和[异步任务]


ZiHao...大约 5 分钟记录javascript
2
3
4
5
6