script 标签的 defer 与 async 属性(转载)

原文戳这里👉:https://github.com/mrlmx/blogs/issues/4 前言在面试的时候,经常会遇到一道经典的面试题: 如何优化网页加载速度? 常规的回答中总会有一条: 把 css 文件放在页面顶部,把 js 文件放在页面底部。 那么,为什么要把 js 文件放在页面的最底部呢? 我们先来看下这段代码: 1234567891011121314<!DOC...

发布于 学习笔记

TS 类型体操

基本原理if(A <= B)if(A <= B) true else false 123type A = 1;type B = 1 | 2;type Result = A extends B ? true : false; // true if(A <= B) and (C <= D)1234567891011type A =...

发布于 学习笔记

面向对象之 class(下)

四种成员可见性public(类外可见)public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public private(类内可见)private 修饰的属性或方法是私有的,不能在声明它的类的外部访问 protected(子类可见)protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的 #var(真私有...

发布于 学习笔记

面向对象之 class(上)

思考题:写入属性时会覆盖共有属性吗?12345678910111213141516171819function Person(name, age) { this.name = name this.age = age}Person.prototype = { constructor: Person, sayHi(target) { cons...

发布于 学习笔记

面向对象之原型

发布于 学习笔记

泛型编程(下)

介绍一些 TS 内置工具类型的用法及实现 Readonly & Mutable123456789101112131415161718192021type Person = { id: number; name: string; age: number };type Readonly<T> = { readonly [K in keyof T...

发布于 学习笔记

泛型编程(上)

泛型就像函数函数 12const f = (a, b) => a + bconst result = f(1, 2) // 3 泛型 12type F<A, B> = A | Btype Result = F<string, number> // string | number 泛型就像函数 函数的本质是什么 函数的本质是推后执行的、部分待定的代码 12...

发布于 学习笔记

深入函数:函数重载、this 和 as const

函数重载(overload)重载允许一个函数在接受不同数量或类型的参数时,作出不同的处理 1234567891011121314151617function createDate(n: number): Date;function createDate(year: number, month: number, date: number): Date;// 中间不能写其他代码,函数类型声明后面...

发布于 学习笔记

深入函数:声明、参数、返回值

深入对象语法描述对象的属性使用接口描述对象 12345678type Person = { name: string}// 或者interface Person { name: string} Person 的子集为 12345678910type Children = | { name: string, age: string &#...

发布于 学习笔记

类型兼容与赋值

为什么要有类型兼容因为实际工作中,往往无法做到类型一致 比如在上面的 JS 代码中,假设 runTask 函数的参数只接受具有 a、b、c 这 3 个 key 的对象,但在一般情况下,即使我们多传一个 d,也不会报错 你有的,我都有,则我能代替你;y 有的,x 都有,则 x 兼容 y 简单类型的兼容类型小的兼容类型大的 注意:图中的大小圆应当是包含关系,即小圆应该在大圆内部,此处为...

发布于 学习笔记

(●'◡'●)ノ♥