自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(200)
  • 收藏
  • 关注

原创 Referer和Referrer Policy及图片防盗链

如何绕过图片防盗链?隐藏 referer(客户端请求隐藏、设置meta、设置referrerpolicy、利用iframe伪造请求referer、服务器作防盗链图片中转)。实现一个简单的服务器端防盗链

2022-08-31 09:41:01 90

原创 Nginx基础之location匹配规则实践篇

location指令的功能是用来匹配不同的url请求,进而对请求做不同的处理和响应。

2022-08-02 22:36:49 520 2

原创 Nginx基础之负载均衡实践篇

Nginx的upstream支持5种 分配方式,其中 轮询、权重、IP散列这三种为Nginx原生支持的分配方式,fair为第三方支持的分配方式。 此外还有 url_hash。自nginx 1.7.2版本后,已经集成了url hash功能,可直接使用,不用安装三方模块。......

2022-07-29 16:13:14 485

原创 TypeScript基础之object、Object、{}区别

学习TypeScript中object、Object、{}区别

2022-07-01 09:30:02 273

原创 TypeScript基础之泛型介绍

文中内容都是参考https://www.typescriptlang.org/docs/handbook/2/generics.html内容。在像C#和Java这样的语言中,可以使用泛型来创建可重用的组件,一个组件可以支持多种类型的数据。 这样用户就可以以自己的数据类型来使用组件。设计泛型的关键目的是在成员之间提供有意义的约束,这些成员可以是:类的实例成员、类的方法、函数参数和函数返回值在之前underscore源码解析内部函数createAssigner、cb和optimizeCb中讲过identity

2022-07-01 09:28:20 90

原创 TypeScript基础之typeof 类型操作符

TypeScript中的typeof常见用途是在类型上下文中获取变量或者属性的类型, 此外还可以配合获取函数的返回值类型, 以及配合 ReturnType 使用获取函数的返回值类型, 以及配合 keyof使用

2022-06-26 20:54:07 731 2

原创 DNS基础之使用dig查询DNS解析过程

文中内容参考DNS 原理入门—阮一峰。DNS服务器怎么会知道每个域名的IP地址呢?答案是分级查询。根域名.root对于所有域名都是一样的,所以平时是省略的。根域名的下一级,叫做"顶级域名"(top-level domain,缩写为TLD),比如:等等再下一级叫做"次级域名"(second-level domain,缩写为SLD),比如里面的,这一级域名是用户可以注册的;...

2022-06-24 21:30:13 652 2

原创 DNS基础之通过dig命令理解DNS域名解析中的A记录,AAAA记录,CNAME记录,MX记录,NS记录

文中内容参考DNS 原理入门—阮一峰。DNS(Domain Name System) 即域名系统。 作用就是根据域名查出 IP 地址。我们使用(Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具)来显示 DNS的查询过程。 ......

2022-06-23 17:55:46 1275

原创 TypeScript基础之模版字面量类型

TypeScript基础之模版字面量类型

2022-06-22 22:13:15 200

原创 TypeScript基础之const断言

TypeScript const类型断言

2022-06-21 17:16:08 106

原创 TypeScript基础之keyof 类型操作符

对一个对象类型使用 keyof 操作符,会返回该对象属性名组成的一个字符串或者数字字面量的联合类型。

2022-06-19 19:13:24 259 2

原创 TypeScript基础之枚举、泛型的兼容性

文中内容都是参考https://www.typescriptlang.org/docs/handbook/type-compatibility.html#handbook-content 内容。枚举类型与数字类型兼容,并且数字类型与枚举类型兼容。比如,不同枚举类型之间是不兼容的, 如下例:泛型的兼容性因为TypeScript是结构性的类型系统,对于泛型的兼容性, 只有当它的类型参数被一个成员使用时,才会影响其兼容性。如下:以上代码里, 和是兼容的, 因为它们的结构使用类型参数时并没有什么不同。即类

2022-06-18 16:37:39 58

原创 TypeScript基础之类的类型兼容性

文中内容都是参考https://www.typescriptlang.org/docs/handbook/type-compatibility.html#handbook-content 内容。类与对象字面量和接口差不多,但有一点不同:类有静态部分和实例部分的类型。在比较两个类型是否兼容时,除了遵照, 还需要注意以下几点:举例进行分析:以上代码中, 类与类拥有共同的属性, 即使它们的构造函数不同, 这两个类也是互相兼容。类的私有成员和受保护成员会影响兼容性。 当检查类实例的兼容时,如果目标类型包含一个

2022-06-18 16:35:32 98

原创 TypeScript基础之类型拓宽(Type Widening)

TypeScript基础之类型拓宽(Type Widening), 拓宽的字面量类型, 非拓宽的字面量类型, 非拓宽字面量类型的用处

2022-06-16 15:58:30 123 4

原创 TypeScript基础之类型收窄(Type Narrowing)

介绍TypeScript类型收窄(Type Narrowing),包括typeof 类型保护、真值收窄、等值收窄、in 操作符收窄、赋值语句、控制流分析、可辨别联合、never、穷尽检查

2022-06-15 15:26:43 165 1

原创 TypeScript基础之结构类型和Freshness

TypeScript 类型兼容性是基于结构类型的;结构类型只使用其成员来描述类型。 类型检查关注的是值的形状, 即。而且一般通过interface定义类型,其实就是定义形状与约束。 所以定义interface其实是针对结构来定义新类型。对于Typescript来说,两个类型只要结构相同,那么它们就是同样的类型。简单来说就是 如果x要兼容y,那么y至少具有与x相同的属性。比如:这里要检查y是否能赋值给x,编译器检查x中的每个属性,看是否能在y中也找到对应属性。 在这个例子中,y必须包含名字是name的s

2022-06-13 20:32:52 79

原创 TypeScript基础之类型断言

文中内容基本上参考https://ts.xcatliu.com/basics/type-assertion.html 。TypeScript中类型断言()可以用来手动指定一个值的类型,用来覆盖TS中的推断。当 TypeScript 确定赋值无效时,我们可以选择使用类型断言来覆盖类型。如果我们使用类型断言,赋值总是有效的,所以我们需要确保我们是正确的。否则,我们的程序可能无法正常运行。两种执行类型断言的方法:基本使用然而,当你在JSX中使用 的断言语法时,会产生语法冲突,因此建议使用 的语法来类型断

2022-06-12 17:40:26 240 3

原创 TypeScript基础之非空断言操作符、可选链运算符、空值合并运算符

先看以下代码:对于以上代码, TypeScript编译器会提示以下错误信息:要解决以上问题,我们可以加个条件判断:此外, 可以使用TypeScript2.0中提供的非空断言操作符()。语法非空断言操作符操作符 可以用于断言操作对象是非 null 和非 undefined 类型。即: 将从 值域中排除 和 。所以以上代码可以改造为:看下编译结果:可以看出非空断言操作符从编译生成的JS代码中移除掉了, 如果handler函数调用时传入或时,会出现以下运行时错误:所以在实际使用时需要注意。

2022-06-10 21:34:01 760

原创 TypeScript基础之常见类型(基本类型、any、unknown、void、never)

默认情况下 和 是所有类型的子类型, 即可以把 和 赋值给其他类型。 tsconfig.json指定了, 和 只能赋值给 、 和它们各自的类型, 可以赋值给类型;以下代码在严格模式下( )下运行:以下代码在非严格模式下(指定了), 可以把 和 赋值给其他类型 如果出现 需要把ypeScript编译器目标设置为es2020在赋值过程中改变类型是不被允许的。虽然和 都表示数字,但是这两个类型不兼容。对于包装类型注意: 是包装类型, 而是原始类型,不要混淆。从类型兼容性上看, 原始类型兼容对

2022-06-09 16:07:54 454

原创 TypeScript基础之类型保护

先来看看JavaScript中typeof的用法:具体可参考 MDN typeofTypeScript中的主要用途是在类型上下文中获取变量或者属性的类型。如:获取对象的类型以上代码中通过typeof获取到person对象的类型,之后我们就可以使用Person类型。对于嵌套对象也是一样:此时UserInfo类型如下:获取函数的类型此时Add类型为instanceof先来看看JavaScript中instanceof的用法:具体可参考 MDN instanceofTypeS

2022-06-08 16:29:08 126

原创 TypeScript基础之类型推断

类型推断是有方向的,要注意区分从左向右和从右向左两种推断的不同引用。基础类型推断发送在在TypeScript中,使用const和let声明的类型,默认推断出的类型是不同的,如:解释: 当我们将一个字面量类型声明为常量,我们就不能再对其进行修改了,因此将其类型推断为赋值的字面量类型,是一种比较合理的设计。而使用 let 声明的字面量类型,因为我们还拥有将其修改为该类型其他字面量的权利,因此TypeScript将其类型转换为了赋值字面量类型的父类型,这种设计也是符合编程预期的。我们将 TypeScript

2022-06-07 18:12:28 120

原创 TypeScript基础之联合类型、交叉类型、类型别名

联合类型表示取值可以为多种类型中的一种,使用 分割每个类型。函数中使用:约束取值以上1 | 2, true | false, ‘click’ | ‘scroll’ | 'mousemove’被称为字面量类型,分别为数字、布尔、字符串字面量类型,可以用来约束取值只能是其中几个值中的一个。交叉类型是将多个类型合并为一个类型,使用定义交叉类型。可以将多个接口类型合并成一个类型,实现等同于接口继承的效果合并的接口类型存在同名属性是什么效果?如果同名属性的类型兼容,比如一个是number,另一个是nu

2022-06-06 20:48:06 302

原创 TypeScript基础之元组(Tuple)

我们知道数组中元素的数据类型都一般是相同的(any[] 类型的数组可以不同),如果存储的元素数据类型不同,则需要使用元组。元组是一种数据类型,可以像任何其他变量一样使用。它表示值的异构集合,也可以作为函数调用中的参数传递。在抽象数学中,术语元组用于表示多维坐标系。JavaScript 没有元组作为数据类型,但在 TypeScript 中可以使用元组。元组中元素的顺序很重要。元组类型只能表示一个已知元素数量和类型的数组,长度已指定,元素类型顺序必须是完全对照的,否则会出现错误信息。虽然可以越界添加元

2022-06-05 17:52:51 186

原创 TypeScript基础之接口(Interfaces)

接口是一系列抽象方法的声明,是一些方法特征的集合,这些方法都应该是抽象的,需要由具体的类去实现,然后第三方就可以通过这组抽象方法调用,让具体的类执行具体的方法。接口处理可用于对类的一部分行为进行抽象外,也常用于对对象的形状进行描述。接口定义如下:在声明一个对象、函数或者类时,先定义接口,确保其数据结构的一致性;以上我们定义了一个接口IPerson,接着定义了一个变量person,它的类型是IPerson。这样,我们就约束了 的形状必须和接口 一致。接口属性可选属性接口里的属性不全都是必需的。

2022-06-05 17:51:45 167

原创 TypeScript基础之函数重载

和JavaScript一样,TypeScript函数可以创建有名字的函数和匿名函数。为函数定义类型由于 JavaScript 是一个动态语言,我们通常会使用不同类型的参数来调用同一个函数,该函数会根据不同的参数而返回不同的类型的调用结果:以上代码在JS环境中运行是没有问题的,但是如果在TypeScript环境下且TypeScript编译器开启配置项时,以上代码会提示以下错误信息:该信息告诉我们参数 x 和参数 y 隐式具有 类型。为了解决这个问题,我们可以为参数设置一个类型。因为我们希望 函

2022-06-05 17:50:26 418

原创 Node.js网络编程之WebSocket篇

WebSocketWebSocket协议是基于 HTTP 协议之上的扩展,是一种可以双向通信的协议。其特点包括:建立在 TCP 协议之上,服务器端的实现比较容易;与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器;数据格式比较轻量,性能开销小,通信高效;可以发送文本,也可以发送二进制数据;没有同源限制,客户端可以与任意服务器通信;协议标识符是ws(如果加密,则为wss),服务器网址就是 URL

2022-05-31 15:38:14 666

原创 LeetCode 230:二叉搜索树中第K小的元素

叉搜索树中第K小的元素题目描述:给定一个二叉搜索树的根节点root,和一个整数k,请你设计一个算法查找其中第k个最小元素(从 1 开始计数)。示例 1:输入:root = [3,1,4,null,2], k = 1输出:1示例 2:输入:root = [5,3,6,2,4,null,null,1], k = 3输出:3链接:230. 二叉搜索树中第K小的元素 - 力扣(LeetCode) (leetco.........

2022-05-19 22:15:58 231

原创 LeedCode 198. 打家劫舍

198. 打家劫舍描述你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例示例1输入:[1,2,3,1]输出:4解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。示例

2022-03-21 18:12:53 54

原创 LeetCode 106:从中序与后序遍历序列构造二叉树

从中序与后序遍历序列构造二叉树题目描述:给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗二叉树。示例 1:输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]输出:[3,9,20,null,null,15,7]示例 2:输入:inorder = [-1], postorder = ....

2022-03-18 15:09:11 141

原创 LeetCode 437:路径总和 III

路径总和 III题目描述:给定一个二叉树的根节点 root,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)示例 1:输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8输出:3解释:和等于 8 的路径有 3 条,如图所示。 示例 .....

2022-03-17 11:04:01 387

原创 LeetCode 236: 二叉树的最近公共祖先

二叉树的最近公共祖先题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。...

2022-03-14 15:25:08 53

原创 LeetCode 235: 二叉搜索树的最近公共祖先

二叉搜索树的最近公共祖先题目描述:翻转一棵二叉树。示例 1:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1链接:235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)解题思路二叉搜索树的特点就是 左子树的所有节点都小于当前节.........

2022-03-14 14:46:17 2155

原创 LeedCode 20: 有效的括号

有效的括号题目描述:给定一个只包括 '(',')','{','}','[',']'的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。示例 1:输入:s = "()"输出:true示例 2:输入:s = "()[]{}"输出:true示例 3:输入:s = "(]"输出:false示例 4:输入:s = "([)]"输出:false...

2022-02-28 21:28:17 86

原创 LeetCode 226: 翻转二叉树

合并二叉树题目描述:翻转一棵二叉树。示例 1:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1链接:226. 翻转二叉树 - 力扣(LeetCode) (leetcode-cn.com)解题思路思路一:递归/深度优先遍历先交换一下左右节点,然后再递归的交换左节点,右节.........

2022-01-19 13:29:29 177

原创 LeetCode 617:合并二叉树

路径总和题目描述:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为NULL 的节点将直接作为新二叉树的节点。示例 1:输入: Tree 1 Tree 2 1 2 .........

2022-01-19 12:43:20 59

原创 LeedCode 121:买卖股票的时机

买卖股票的最佳时机题目描述:给定一个数组 prices ,它的第i 个元素prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。示例 1:输入:[7,1,5,3,6,4]输出:5解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出...

2022-01-18 22:23:09 44

原创 LeetCode 104:二叉树的最大深度

二叉树的最大深度题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7]示例 1: 3 / \ 9 20 / \ 15 7返回它的最大深度3 。链接:104. 二叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)解题思路思路一:递归.....

2022-01-13 21:47:15 121

原创 LeetCode 105:从前序与中序遍历序列构造二叉树

从前序与中序遍历序列构造二叉树题目描述:给定一棵树的前序遍历preorder与中序遍历inorder。请构造二叉树并返回其根节点。示例 1:输入:preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]输出:[3,9,20,null,null,15,7]示例 2:输入:preorder = [-1], inorder = [-1]输出:[-1]示例 3:输入:root = []输......

2022-01-13 21:21:33 63

原创 LeetCode 102:二叉树的层序遍历

二叉树的层序遍历题目描述:给你二叉树的根节点root,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点)示例 1:输入:root = [3,9,20,null,null,15,7]输出:[[3],[9,20],[15,7]]示例 2:输入:root = [1]输出:[[1]]示例 3:输入:root = []输出:[]链接:102. 二叉树的层序遍历 - 力扣(LeetCode) (leetcode-.......

2022-01-11 21:57:49 192

原创 LeetCode 113:路径总和 II

路径总和 II题目描述:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4,11,2],[5,8,4,5]]示例 2:输入:root = [1,2,3], targetSum =...

2022-01-11 21:28:28 214

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除