C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。

运行查看效果

局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using WindowsFormsApp7.Resources;
using static System.Net.Mime.MediaTypeNames;namespace WindowsFormsApp1
{public partial class Form1: Form{private const int WS_EX_LAYERED = 0x00080000;protected override CreateParams CreateParams{get{CreateParams cp = base.CreateParams;cp.ExStyle |= WS_EX_LAYERED;return cp;}}public Form1(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){InitializeComponent();var bitmap = Properties.Resources.index00;byte opacity = 255;//0-255 透明度调整double scalePercentage = 70; // 背景图片按70%缩放SetBitmap(bitmap, opacity, scalePercentage);CenterWindow(); //窗口 绝对 居中}public void SetBitmap(Bitmap bitmap, byte opacity, double scalePercentage){// 检查传入的位图的像素格式是否为 32 位包含 alpha 通道if (bitmap.PixelFormat != PixelFormat.Format32bppArgb)// 如果不是 32 位包含 alpha 通道的格式,抛出一个应用程序异常throw new ApplicationException("位图必须是 32 位包含 alpha 通道");// 计算缩放后的宽度和高度int newWidth = (int)(bitmap.Width * scalePercentage / 100);int newHeight = (int)(bitmap.Height * scalePercentage / 100);// 更新窗口的大小this.Size = new Size(newWidth, newHeight);// 缩放位图Bitmap resizedBitmap = new Bitmap(bitmap, newWidth, newHeight);// 获取屏幕设备上下文的句柄。设备上下文(DC)是一个包含图形对象及其属性、影响输出的图形模式的结构IntPtr screenDc = APIAliasing.GetDC(IntPtr.Zero);// 创建一个与指定设备上下文(这里是屏幕设备上下文)兼容的内存设备上下文IntPtr memDc = APIAliasing.CreateCompatibleDC(screenDc);// 初始化一个 IntPtr 类型的变量,用于存储位图的句柄,初始值为 IntPtr.Zero 表示空句柄IntPtr hBitmap = IntPtr.Zero;// 初始化一个 IntPtr 类型的变量,用于存储之前选入内存设备上下文的对象的句柄,初始值为 IntPtr.Zero 表示空句柄IntPtr oldBitmap = IntPtr.Zero;try{// 将 Bitmap 对象转换为 GDI 位图,并返回该位图的句柄。Color.FromArgb(0) 表示使用透明颜色hBitmap = resizedBitmap.GetHbitmap(Color.FromArgb(0));// 将指定的位图选入指定的设备上下文,并返回之前选入该设备上下文的对象的句柄oldBitmap = APIAliasing.SelectObject(memDc, hBitmap);// 创建一个 APIAliasing.Size 结构体的实例,用于表示位图的宽度和高度APIAliasing.Size size = new APIAliasing.Size(newWidth, newHeight);// 创建一个 APIAliasing.Point 结构体的实例,用于表示位图的源点(这里是左上角,坐标为 (0, 0))APIAliasing.Point pointSource = new APIAliasing.Point(0, 0);// 创建一个 APIAliasing.Point 结构体的实例,用于表示要绘制位图的目标位置,Left 和 Top 应该是类的属性,表示控件的左上角坐标APIAliasing.Point topPos = new APIAliasing.Point(Left, Top);// 创建一个 APIAliasing.BLENDFUNCTION 结构体的实例,用于指定混合操作的参数APIAliasing.BLENDFUNCTION blend = new APIAliasing.BLENDFUNCTION();// 设置混合操作的模式为 AC_SRC_OVER,表示源位图覆盖目标位图blend.BlendOp = APIAliasing.AC_SRC_OVER;// 混合标志,这里设置为 0 表示没有特殊的混合标志blend.BlendFlags = 0;// 设置源位图的常量 alpha 值,取值范围是 0 - 255,由传入的 opacity 参数决定blend.SourceConstantAlpha = opacity;// 设置 alpha 通道的格式为 AC_SRC_ALPHA,表示使用源位图的 alpha 通道blend.AlphaFormat = APIAliasing.AC_SRC_ALPHA;// 更新分层窗口的内容,将位图绘制到指定的窗口上。// Handle 是窗口的句柄,screenDc 是屏幕设备上下文,topPos 是目标位置,size 是位图大小,// memDc 是内存设备上下文,pointSource 是源点,0 是颜色键(这里不使用),blend 是混合参数,// APIAliasing.ULW_ALPHA 表示使用 alpha 混合模式APIAliasing.UpdateLayeredWindow(Handle, screenDc, ref topPos, ref size, memDc, ref pointSource, 0, ref blend, APIAliasing.ULW_ALPHA);}finally{// 释放之前获取的屏幕设备上下文,将其返回给系统APIAliasing.ReleaseDC(IntPtr.Zero, screenDc);// 检查位图句柄是否不为空if (hBitmap != IntPtr.Zero){// 将之前选入内存设备上下文的对象重新选入,恢复设备上下文的状态APIAliasing.SelectObject(memDc, oldBitmap);// 删除之前创建的 GDI 位图对象,释放相关的系统资源APIAliasing.DeleteObject(hBitmap);}// 删除之前创建的内存设备上下文,释放相关的系统资源APIAliasing.DeleteDC(memDc);// 释放缩放后的位图资源resizedBitmap.Dispose();}}public void CenterWindow(){// 获取屏幕的工作区域(不包括任务栏)Rectangle screenBounds = Screen.PrimaryScreen.WorkingArea;// 计算窗口居中时的左上角坐标int left = (screenBounds.Width - Width) / 2 + screenBounds.Left;int top = (screenBounds.Height - Height) / 2 + screenBounds.Top;// 设置窗口的位置Location = new Point(left, top);}}
}
添加类 类名:APIAliasing
// 定义一个公共类 APIAliasing,用于封装一些 Windows API 相关的辅助功能
class APIAliasing
{// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局// 顺序布局意味着结构体的字段在内存中按照声明的顺序依次排列[StructLayout(LayoutKind.Sequential)]// 定义一个公共结构体 Size,用于表示二维平面上的大小,通常包含宽度和高度信息public struct Size{// 定义一个 32 位有符号整数类型的字段 cx,用于表示宽度public Int32 cx;// 定义一个 32 位有符号整数类型的字段 cy,用于表示高度public Int32 cy;// 定义结构体的构造函数,用于初始化结构体的字段// 参数 x 用于初始化 cx 字段,参数 y 用于初始化 cy 字段public Size(Int32 x, Int32 y){// 将参数 x 的值赋给字段 cxcx = x;// 将参数 y 的值赋给字段 cycy = y;}}// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局,并且设置字节对齐方式为 1 字节// 这样可以确保结构体的字段在内存中紧密排列,没有额外的填充字节[StructLayout(LayoutKind.Sequential, Pack = 1)]// 定义一个公共结构体 BLENDFUNCTION,用于表示混合操作的相关参数public struct BLENDFUNCTION{// 定义一个字节类型的字段 BlendOp,用于指定混合操作的类型public byte BlendOp;// 定义一个字节类型的字段 BlendFlags,用于指定混合操作的标志位public byte BlendFlags;// 定义一个字节类型的字段 SourceConstantAlpha,用于指定源图像的常量透明度值public byte SourceConstantAlpha;// 定义一个字节类型的字段 AlphaFormat,用于指定源图像的透明度格式public byte AlphaFormat;}// 使用 StructLayout 属性指定结构体在内存中的布局方式为顺序布局[StructLayout(LayoutKind.Sequential)]// 定义一个公共结构体 Point,用于表示二维平面上的一个点,通常包含 x 和 y 坐标信息public struct Point{// 定义一个 32 位有符号整数类型的字段 x,用于表示点的 x 坐标public Int32 x;// 定义一个 32 位有符号整数类型的字段 y,用于表示点的 y 坐标public Int32 y;// 定义结构体的构造函数,用于初始化结构体的字段// 参数 x 用于初始化字段 x,参数 y 用于初始化字段 ypublic Point(Int32 x, Int32 y){// 将参数 x 的值赋给字段 xthis.x = x;// 将参数 y 的值赋给字段 ythis.y = y;}}// 定义一个公共常量 AC_SRC_OVER,值为 0// 该常量通常用于指定混合操作的模式,表示源图像覆盖目标图像public const byte AC_SRC_OVER = 0;// 定义一个公共常量 ULW_ALPHA,值为 2// 该常量通常用于 UpdateLayeredWindow 函数,表示使用 alpha 混合public const Int32 ULW_ALPHA = 2;// 定义一个公共常量 AC_SRC_ALPHA,值为 1// 该常量通常用于指定源图像包含 alpha 通道信息public const byte AC_SRC_ALPHA = 1;// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 CreateCompatibleDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于创建一个与指定设备上下文兼容的内存设备上下文[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 CreateCompatibleDC,用于调用 Windows API 中的同名函数// 参数 hDC 表示要创建兼容设备上下文的源设备上下文句柄// 返回值为创建的兼容设备上下文的句柄public static extern IntPtr CreateCompatibleDC(IntPtr hDC);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 GetDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于获取指定窗口的设备上下文句柄[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 GetDC,用于调用 Windows API 中的同名函数// 参数 hWnd 表示要获取设备上下文的窗口句柄// 返回值为获取的设备上下文的句柄public static extern IntPtr GetDC(IntPtr hWnd);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 SelectObject 函数// ExactSpelling = true 表示使用精确的函数名进行查找// 该函数用于将指定的对象(如位图、画笔等)选入指定的设备上下文中[DllImport("gdi32.dll", ExactSpelling = true)]// 定义一个公共静态外部方法 SelectObject,用于调用 Windows API 中的同名函数// 参数 hDC 表示要选入对象的设备上下文句柄// 参数 hObj 表示要选入设备上下文的对象句柄// 返回值为之前选入该设备上下文的对象句柄public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObj);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 ReleaseDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// 该函数用于释放之前通过 GetDC 函数获取的设备上下文[DllImport("user32.dll", ExactSpelling = true)]// 定义一个公共静态外部方法 ReleaseDC,用于调用 Windows API 中的同名函数// 参数 hWnd 表示之前获取设备上下文的窗口句柄// 参数 hDC 表示要释放的设备上下文句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 DeleteDC 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于删除指定的设备上下文[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 DeleteDC,用于调用 Windows API 中的同名函数// 参数 hDC 表示要删除的设备上下文句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int DeleteDC(IntPtr hDC);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 DeleteObject 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于删除指定的图形对象(如位图、画笔等)[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 DeleteObject,用于调用 Windows API 中的同名函数// 参数 hObj 表示要删除的图形对象句柄// 返回值为操作结果,非零表示成功,零表示失败public static extern int DeleteObject(IntPtr hObj);// 使用 DllImport 属性引入 user32.dll 动态链接库中的 UpdateLayeredWindow 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于更新分层窗口的内容,支持 alpha 混合等效果[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 UpdateLayeredWindow,用于调用 Windows API 中的同名函数// 参数 hwnd 表示要更新的分层窗口句柄// 参数 hdcDst 表示目标设备上下文句柄// 参数 pptDst 表示目标窗口的左上角坐标,使用 Point 结构体// 参数 psize 表示要更新的区域大小,使用 Size 结构体// 参数 hdcSrc 表示源设备上下文句柄// 参数 pptSrc 表示源图像的左上角坐标,使用 Point 结构体// 参数 crKey 表示颜色键,用于指定透明颜色// 参数 pblend 表示混合操作的参数,使用 BLENDFUNCTION 结构体// 参数 dwFlags 表示更新操作的标志位// 返回值为操作结果,非零表示成功,零表示失败public static extern int UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pptSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);// 使用 DllImport 属性引入 gdi32.dll 动态链接库中的 ExtCreateRegion 函数// ExactSpelling = true 表示使用精确的函数名进行查找// SetLastError = true 表示在调用函数失败时可以通过 GetLastError 函数获取错误代码// 该函数用于创建一个复杂的区域对象[DllImport("gdi32.dll", ExactSpelling = true, SetLastError = true)]// 定义一个公共静态外部方法 ExtCreateRegion,用于调用 Windows API 中的同名函数// 参数 lpXform 表示可选的变换矩阵指针// 参数 nCount 表示区域数据的数量// 参数 rgnData 表示区域数据的指针// 返回值为创建的区域对象的句柄public static extern IntPtr ExtCreateRegion(IntPtr lpXform, uint nCount, IntPtr rgnData);
}
相关文章:
C# 背景 透明 抗锯齿 (效果完美)
主要是通过 P/Invoke 技术调用 Windows API 函数 gdi32.dll/user32.dll,同时定义了一些结构体来配合这些 API 函数的使用,常用于处理图形绘制、窗口显示等操作。 运行查看效果 局部放大,抗锯齿效果很不错,尾巴毛毛清晰可见。 using System; u…...
Debezium:实时数据捕获与同步的利器
一、什么是 Debezium Debezium 是一个开源的分布式平台,专门用于捕获数据库中的数据变更。它通过读取数据库的事务日志,能够以非侵入性的方式捕获数据库中发生的所有变化,并将这些变化转化为事件流,实时推送到像 Kafka 这样的消息…...
Word中接入大模型教程
前言 为什么要在word中接入大模型呢? 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事,拆分一下就是: 获取用户…...
Centos修改ip
1 查看ip [rootlocalhost ~]# ip addr2 root账号修改ip [rootlocalhost ~]# su [rootlocalhost ~]# cd /etc/sysconfig/network-scripts/ [rootlocalhost network-scripts]# llvi编辑ifcfg-ens33 3 重启网卡 [rootlocalhost network-scripts]# systemctl restart network...
uni-app小程序开发 基础知识2
目标: 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码: <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…...
第4章 4.1 Entity Framework Core概述
4.1.1 什么是ORM ORM (object tralstional mapping ,对象关系映射)中的“对象”指的就是C#中的对象,而“关系”是关系型数据库,“映射”指搭建数据库与C#对象之间的“桥梁”。 比如使用ORM ,可以通过创建C#对象的方式把数据插入数据库而不需…...
在 Spring Boot 中使用 `@Autowired` 和 `@Bean` 注解
文章目录 在 Spring Boot 中使用 Autowired 和 Bean 注解示例背景 1. 定义 Student 类2. 配置类:初始化 Bean3. 测试类:使用 Autowired 注解自动注入 Bean4. Spring Boot 的自动装配5. 总结 在 Spring Boot 中使用 Autowired 和 Bean 注解 在 Spring Bo…...
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好?
Langchain vs. LlamaIndex:哪个在集成MongoDB并分析资产负债表时效果更好? 随着大语言模型(LLM)在实际应用中的普及,许多开发者开始寻求能够帮助他们更高效地开发基于语言模型的应用框架。在众多框架中,La…...
Java 中的内存泄漏问题及解决方案
在 Java 中,内存泄漏(Memory Leak)是指在程序运行过程中,某些对象已经不再使用,但由于引用仍然存在,这些对象无法被垃圾回收器回收,从而导致内存无法释放,最终可能导致系统性能下降甚…...
VS Code 如何搭建C/C++开发环境
目录 1.VS Code是什么 2. VS Code的下载和安装 2.1 下载和安装 2.2.1 下载 2.2.2 安装 2.2 环境的介绍 2.3 安装中文插件 3. VS Code配置C/C开发环境 3.1 下载和配置MinGW-w64编译器套件 3.1.1 下载 3.1.2 配置 3.2 安装C/C插件 3.3 重启VSCode 4. 在VSCode上编写…...
【Linux C/C++开发】Linux系统轻量级的队列缓存mqueue
前言 开发设计时,通常会对业务流程进行模块化,有些流程之间,不要求同步,但又需要传递信息时,如果存储到数据库,效率降低很多,如果是存放在内存是最好的。此时可以选择系统的IPC(进程…...
排查生产sql查询缓慢
生产投产检验,发现查询客户明细的接口数据响应需要5秒以上,通过接口可以查询到详细的后端代码 1. 先排查后端的代码实现,并未出现复杂逻辑,那么就应该是sql的问题 2. 通过explain对sql进行解析,发现sql没有走索引 3.…...
idea从远程gitee拉取项目
文章目录 从gitee上面拿到项目地址填写远程地址,并且设置项目保存位置拉取成功 从gitee上面拿到项目地址 填写远程地址,并且设置项目保存位置 拉取成功...
【UCB CS 61B SP24】Lecture 5 - Lists 3: DLLists and Arrays学习笔记
本文内容为构建双向循环链表、使用 Java 的泛型将其优化为通用类型的链表以及数组的基本语法介绍。 1. 双向链表 回顾上一节课写的代码,当执行 addLast() 与 getLast() 方法时需要遍历链表,效率不高,因此可以添加一个指向链表末尾的索引&am…...
软件测试与软件开发之间的关系
软件测试与软件开发的关系 软件测试(Software Testing)与软件开发(Software Development)是软件工程中的两个核心环节,它们相辅相成,确保软件的质量和功能满足需求。以下是两者之间的关系解析:…...
QT 建立一片区域某种颜色
绘制一个位于(50, 50)的200x200的红色矩形 #include "widget.h" #include "ui_widget.h" #include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);update(); }Widget::~Widget() {delete…...
LeetCode--23. 合并 K 个升序链表【堆和分治】
23. 合并 K 个升序链表 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 正文 这道题有多种解决方案 堆 比较容易,又比较直观的就是堆排序,将每个节点加入最小根堆中&…...
tp6上传文件大小超过了最大值+验证文件上传大小和格式函数
问题: 最近用tp6的文件上传方法上传文件时报文件过大错误。如下所示: $file $this->request->file(file);{"code": 1,"msg": "上传文件大小超过了最大值!","data": {"code": 1,&q…...
解决 Mac 只显示文件大小,不显示目录大小
前言 在使用 mac 的时候总是只显示文件的大小,不显示文件夹的大小,为了解决问题可以开启“计算文件夹”。 步骤 1.进入访达 2.工具栏点击“显示”选项,点击 “查看显示选项” 3.勾选 显示“资源库"文件夹 和 计算所有大小 或者点击…...
分布式大语言模型服务引擎vLLM论文解读
论文地址:Efficient Memory Management for Large Language Model Serving with PagedAttention 摘要 大语言模型(LLMs)的高吞吐量服务需要一次对足够多的请求进行批处理。然而,现有系统面临困境,因为每个请求的键值…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
图解JavaScript原型:原型链及其分析 | JavaScript图解
忽略该图的细节(如内存地址值没有用二进制) 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么:保存在堆中一块区域,同时在栈中有一块区域保存其在堆中的地址(也就是我们通常说的该变量指向谁&…...
