JavaScript 是一种功能强大且灵活的编程语言,广泛用于 Web 开发。以下是 JavaScript 中需要掌握的主要概念和思想: 基本语法和数据类型: 变量声明(var, let, const) 基本数据类型(Number, String, Boolean, Null, Undefined,
函数式编程(Functional Programming, FP)是一种编程范式,它强调使用纯函数和不可变数据。以下是软件开发中常用的一些函数式编程设计模式: 1. 纯函数(Pure Functions) 纯函数是指在相同的输入下总是返回相同的输出,并且没有任何副作用(如修改全局状态或变量)。 co
ES6迭代器和中间件是两个不同的概念,解决不同的问题,并且在编程中的应用场景也不同。以下是它们的区别和各自的特点: ES6 迭代器 定义 迭代器是一种设计模式,允许你遍历一个集合(如数组、对象、字符串等)中的所有元素,而不需要了解集合的内部结构。ES6引入了迭代器和生成器,使得遍历集合变得更加简单和
尾递归(Tail Recursion)是函数式编程中的一个重要概念,它指的是递归调用发生在函数的最后一步。尾递归的一个关键特性是,递归调用的结果直接返回给调用者,而不需要进行额外的计算。这使得编译器或解释器可以优化递归调用,避免创建新的栈帧,从而提高性能和减少栈溢出的风险。 尾递归的特点 递归调用是
Monad 是函数式编程中的一个重要概念,它提供了一种结构化的方式来处理计算中的副作用(如状态、I/O、异常处理等)。Monad 可以被看作是一种设计模式,用于将计算过程中的一系列操作进行组合和链接。 什么是 Monad? Monad 是一种带有三个基本属性的抽象数据类型: 单元(Unit):也称为
设计模式是软件开发中的重要概念,掌握设计模式可以帮助你编写更高效、可维护和可扩展的代码。以下是一些需要掌握的设计模式知识点: 设计模式的分类: 创建型模式:处理对象创建的模式,如单例模式、工厂模式、抽象工厂模式、建造者模式和原型模式。 结构型模式:处理对象组合的模式,如适配器模式、桥接模式、组合模式
函数式编程(Functional Programming,FP)是一种编程范式,强调使用纯函数和不可变数据。不可变性(Immutability)是函数式编程的核心概念之一。理解不可变性有助于编写更可靠、可预测和易于调试的代码。 不可变性概念 不可变性指的是一旦创建,数据结构就不能被修改。相反,任何对
编写全面的测试用例是确保软件质量的关键步骤。以下是一些方法和最佳实践,可以帮助测试人员编写全面的测试用例: 1. 理解需求和功能 需求文档:详细阅读和理解需求文档,确保对每个功能和业务逻辑有清晰的理解。 用户故事:从用户的角度理解应用的功能,确保覆盖所有用户场景。 2. 使用测试设计技术
函数式编程是一种编程范式,强调使用函数和避免状态变化和可变数据。以下是函数式编程要掌握的一些关键知识点: 1. 纯函数 定义:纯函数是指给定相同的输入总是返回相同的输出,并且没有任何可观察的副作用。 示例: const add = (a, b) => a + b; 2. 不可变性
封装思想上来说,逻辑应与UI分离,有利于单元测试和解耦; 从软件架构上来说,UI应该是薄薄的一层,很多逻辑与UI是可以分离的,只有状态逻辑(驱动页面更新的逻辑)才属于UI; 从业务上来说,组件要分业务组件和通用组件,业务组件可以依赖通用组件,如调用接口的下拉组件封装,业务组件封装可以将api封装进去
参考:https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API 如果要兼容低版本浏览器,推荐使用: localForage:一个简单的 Polyfill,提供了简单的客户端数据存储的值语法。它在后台使用 IndexedDB,并在不支
单元测试和集成测试是软件测试中的两种不同类型,它们的目标和范围有所不同。 单元测试 目标:验证单个功能单元(通常是一个函数或一个类)的正确性。 范围:单元测试的范围非常小,通常只测试一个函数或一个类的特定行为。 特点: 独立性:单元测试应该是独立的,不依赖于其他单元的实现。
在React项目中,常用的单元测试工具包括: Jest:一个由Facebook开发的JavaScript测试框架,默认与Create React App集成。 React Testing Library:一个用于测试React组件的工具,强调用户行为而不是实现细节。 Enzyme:由Airbnb开发
代码测试是软件开发过程中至关重要的一部分,确保代码的正确性、稳定性和可维护性。以下是代码测试的主要原因和需要掌握的思想: 为什么需要测试代码? 确保正确性:测试可以验证代码是否按预期工作,捕捉潜在的错误和缺陷。 提高稳定性:通过测试,可以在代码变更时确保现有功能不受影响,防止引入新的错误。 增强可维
@vue/test-utils 提供了两个主要的挂载方法:mount 和 shallowMount。它们的主要区别在于组件的渲染深度。 mount 完整渲染:mount 会完整地渲染组件,包括其子组件。 适用场景:适用于需要测试组件与其子组件之间交互的场景。 示例: import { mount }
原文链接:https://zhuanlan.zhihu.com/p/654234711 整洁架构除了以下至少四层架构外,在层与层之间还有一个非常明确的依赖关系,外层的逻辑依赖内层的逻辑 (图中黑色箭头指向),但是内层的代码不可以依赖外层。 实体层: 业务实体这一层中封装的是整个系统的关键业务逻辑。这
在进行快照测试时,通常会在组件的初始渲染和某些交互(如点击事件)之后分别进行快照。这可以帮助你捕获组件在不同状态下的输出,并确保这些状态变化是预期的。 以下是一个示例,展示了如何在点击事件发生后进行快照测试: 示例组件 假设你有一个 Vue 组件 Detail.vue,其中包含一个点击事件: <te
快照测试文件应该上传到 Git 仓库中。以下是一些原因和最佳实践: 为什么要上传快照文件 版本控制:快照文件是测试的一部分,上传到 Git 仓库可以确保团队中的所有成员都能访问最新的快照文件,并且可以跟踪快照文件的历史变化。 一致性:上传快照文件可以确保在不同的开发环境中运行测试时,使用的是相同的快
Jest 的快照测试是一种用于验证组件输出的有效方法,特别适用于 UI 组件。快照测试通过将组件的输出保存为快照文件,并在后续测试中将当前输出与快照进行比较。如果输出发生变化,测试将失败,从而提醒开发者检查这些变化是否是预期的。 理解快照测试 创建快照:在第一次运行快照测试时,Jest 会生成一个快
export interface ListCardProps { height?: number; moreText?: string; tabList: Record<string, React.ReactNode>; contentList?: Record< strin
前端测试通常包括以下几种类型: 单元测试(Unit Testing):测试单个组件或函数的功能是否正确。 集成测试(Integration Testing):测试多个组件或模块之间的交互是否正常。 端到端测试(End-to-End Testing):模拟用户操作,测试整个应用的工作流程是否正确。 快
函数式编程是一种编程范式,它强调使用纯函数和不可变数据来构建程序。以下是对函数式编程的理解、如何使用以及一些关键原则: 理解函数式编程 纯函数:纯函数是指给定相同的输入总是返回相同的输出,并且没有任何副作用(例如修改全局状态或输出到控制台)。 不可变性:在函数式编程中,数据是不可变的。每次对数据进行
// 直接使用联合类型判断,ts会将其视为整体进行判断,而不是一个一个进行判断 type Test = string | number | boolean extends string ? string : never; // never type Test2 = string extends st
TypeScript的类型映射(Mapped Types)是一种强大的特性,允许你基于现有类型创建新的类型。类型映射通常用于对类型进行批量操作,比如将所有属性设为可选、只读,或者将属性类型进行转换。 以下是一些常见的类型映射示例: 1. 基本类型映射 假设你有一个接口Person: interfac
实例层和用例层的理解 例:添加一个商品到购物车 这里就是一个用例,用户添加商品到购物车 商品是一个实例,购物车也是一个实例 用例层是用户怎么使用,比如购买商品的完整流程,它不是单个的实例,通常关系到多个实例,使用时,调用用例层购买商品的方法,完成购买操作。 实例层是独立的,它不依赖其它实例(继承是对
TypeScript 的类型体操(TypeScript Type Manipulation)是指通过类型系统进行复杂的类型操作和推断,以实现更灵活和强大的类型检查。 in keyof 跟 for ... in 相似,不过 in keyof 是用来操作类型的 interface Person {
在 TypeScript 中,类型系统是基于结构类型(structural typing)而不是名义类型(nominal typing)。这意味着 TypeScript 关注的是类型的形状(结构),而不是它们的名字或声明方式。只要两个类型的结构兼容,它们就可以互相赋值。 结构类型系统的理解 结构匹配
在 TypeScript 中,子类和父类的兼容性规则遵循面向对象编程的基本原则,即子类可以被视为父类的实例。这种兼容性主要体现在以下几个方面: 子类实例可以赋值给父类类型的变量: 子类继承了父类的所有属性和方法,因此子类实例可以赋值给父类类型的变量。 方法重载和重写: 子类可以重写父类的方法,但必须
在 TypeScript 中,可以通过以下几种方式来判断两个类型是否兼容: 使用类型断言:通过类型断言可以将一个类型转换为另一个类型,如果类型不兼容,TypeScript 会报错。 使用类型守卫:通过类型守卫可以在运行时检查类型。 使用类型条件:通过条件类型可以在编译时检查类型。 以下是一些示例代码
infer的定义 infer 表示在 extends 条件语句中以点位符出现的等到使用时才推断出来的数据类型 type Fn = (params: string) => number; // 第一种应用场景:获取函数的返回值类型 type TypeReturn = Fn extends (...ar
在 TypeScript 中,类型的协变(Covariance)和逆变(Contravariance)描述的是在类型系统中,类型之间的关系如何随着类型操作(如函数参数和返回类型)的方向而改变。这些概念主要在函数类型的参数和返回值的类型关系中体现。 协变(Covariance) 协变指的是能够保持类型
为什么要用函数重载? enum MessageType { "Image" = "Image", "Audio" = "Audio", } type Message = { id: number; type: MessageType; content: string; };
出于安全原因,浏览器不允许直接从文件系统路径读取文件。这是为了保护用户的隐私和安全,防止恶意网站访问用户的文件系统。用户必须通过文件选择对话框(例如,<input type="file"> 元素)或拖放操作主动选择文件,浏览器才能访问这些文件。 一旦用户选择了文件,可以使用 JavaScript 的
IndexedDB 是一个在大多数现代浏览器中都支持的 Web API,用于客户端存储大量结构化数据。它提供了丰富的查询能力,并能在后台异步访问,使得它非常适合需要在客户端存储大量数据的 Web 应用程序。 IndexedDB 的兼容性非常好,支持以下浏览器: - Google Chrome:从版本
JavaScript 的模块化不完全等同于单例模式,但在某些方面它们之间确实存在相似之处。下面是两者的比较: 单例模式: 单例模式是一种设计模式,确保一个类只有一个实例,并提供一个全局访问点。 在单例模式中,无论你尝试创建多少次对象,都只会得到同一个实例。 单例模式通常用于管理共享资源,如数据库连接
在终端中执行Git回滚操作,可以使用git reset命令回滚到指定的commit。这里有几种不同的方式来回滚,取决于你想要的结果: 软回滚(Soft):这将回滚到你指定的commit,但是保留工作目录和暂存区的状态不变,即你所做的任何更改都会保留,但是Git历史会重置到指定的commit。 git
AI发展到能够不靠现有的知识,而是自己创造知识,自己验证对错后重新调整,不断探索时,就是我们失业的时候。 如alpha go,自己跟自己博弈,然后在围棋领域超越了所有人。 现有的大模型还无法解决现有数据里没有的知识,不能够创新的去解决问题。如:阿里巴巴数学竞赛,AI全军覆没。 Talk is che
为什么要使用泛型?泛型定义 泛型的特点 泛型的宽泛:定义时不明确使用时必须明确成某种具体数据类型的数据类型 泛型的严谨:编译期间进行数据类型检查的数据类型 泛型形参类型一般有两种表示:1. A-Z任何一个字母 2. 语义化的单词来表示 class ArrayList<T> { array: Ar
现在前端适配:适配多端和适配多框架 整洁架构在前端应用实践中,如果你依赖某个组件功能扩展,就不可能完全不依赖三方框架,如果想完全不依赖,则需要完全自己写,而不是扩展。 当我们的目标是扩展一个组件库时,核心层(用例层和实例层)可以依赖该组件库,而在前端要适配多框架的情况下,只可依赖该组件库的定义,不能
类型断言 let a: A let b: B = a as B 绕过TS编译检查,类型断言就是告诉编译器我是这个类型,无需检查 类型必须有重合才能断言 类型断言应用场景: class Animal { name: string; constructor(name: string) {
ES5原型继承 function Animal(name) { this.name = name; } Animal.prototype.eat = function () { console.log(this.name + " is eating."); }; function Dog
TypeScript 5.5 引入了类型谓词的自动推断,这是由 Dan Vanderkam 实现的。这项特性改进了 TypeScript 在控制流分析中对变量类型变化的跟踪能力,特别是在处理数组和过滤操作时。 类型谓词自动推断 在之前的 TypeScript 版本中,即使通过过滤操作移除了 unde
{ "compilerOptions": { /* 访问 https://aka.ms/tsconfig 以了解更多关于此文件的信息 */ /* 项目 */ // "incremental": true, /*
TypeScript 中没有内置的“方法拦截器”,但可以通过几种方式模拟方法拦截的行为,主要是利用高级类型和装饰器(Decorators)功能。方法拦截器通常用于在方法调用前后执行一些逻辑,比如日志记录、性能监控、验证等。 Object.getOwnPropertyDescriptor实现 clas
中间件和方法拦截器都是在软件开发中用于处理请求或调用的技术,它们可以在执行某些操作之前或之后添加额外的处理逻辑。尽管它们的目的相似,但它们在应用场景和实现方式上有所不同。 中间件(Middleware) 中间件是一种位于请求处理流程中的软件组件,通常用于处理HTTP请求。它可以对请求进行预处理,然后
写一个装饰器自动记录类的方法调用信息,包括参数、返回值和执行时间,有助于调试和监控应用行为。 以下是一个使用TypeScript装饰器来实现日志记录功能的示例。这个装饰器会自动记录任何被装饰方法的调用信息,包括方法名、传入的参数、返回值以及方法的执行时间。 首先,定义一个方法装饰器Log: func
TypeScript装饰器提供了一种强大的模式,用于在声明时添加元数据和行为逻辑,而无需修改原有类、方法或属性的代码。装饰器的应用场景非常广泛,以下是一些常见的应用场景: 日志记录:自动记录类的方法调用信息,包括参数、返回值和执行时间,有助于调试和监控应用行为。 性能监测:测量方法执行时间,用于性能
总结:本文看一下了解即可,建议只使用小写类型,不使用大写类型。 JavaScript 的8种类型之中,undefined和null其实是两个特殊值,object属于复合类型,剩下的五种属于原始类型(primitive value),代表最基本的、不可再分的值。 boolean string numb
8种基本类型:string、number、boolean、undefind、null、object、symbol、bigint(ES2020 标准引入) 特殊值:undefind、null 复合类型:object 原始类型:string、number、boolean、symbol、bigint(ES
以后还是吃猪油,自已熬油 食品安全大问题,有能力全部要自己做,信不了这些吃人血的资本家半点 减少吃外卖,少吃大餐,尽量自己做 猪油、菜籽油、盐、味精、酱油(不要买老抽生抽等工业制品),就吃这几样和健康食材就可以了。要想以后活的不痛苦,少吃工业制品! 成为你想成为的那种人,没有时间限制,随时都能开始。
在Mac上设置全局JDK,需要配置JAVA_HOME环境变量。这里是如何做的: 打开终端。 找到JDK安装路径: 如果不确定JDK的安装位置,可以使用/usr/libexec/java_home -V命令列出所有安装的JDK及其路径。 编辑shell配置文件: 根据你使用的shell,这可能是~/.
在前端开发中,如果使用面向对象的方式编写代码,不使用的代码是否会被打包进最终的构建结果,主要取决于使用的模块系统和构建工具。现代前端构建工具(如Webpack、Rollup、Parcel等)通常支持一项称为“树摇(Tree Shaking)”的特性,这可以帮助移除未被使用的代码。 树摇(Tree S
选择比努力更重要 AI对于个人来说有哪些机会?AI会取代前端吗?如果会,那是否应该继续卷技术? 我认为AI对于个人来说,只是提供了就业机会(AI相关专业),AI创业的话,成本和门槛很高,没有资本是玩不起来的(非调用api,而是AI研发)。 对于个人来说,也有一些其它机会,如AI工具和自动化可以帮助个
在React应用中,函数式编程(FP)和面向对象编程(OOP)都可以使用,但近年来,随着React Hooks的引入,函数式编程变得更受欢迎和推荐。 函数式编程在React中的优势: 1. 简洁性:函数组件通常比类组件更简洁,易于理解和维护。 2. Hooks:React 16.8引入的Hooks允
面向对象编程(OOP)与函数式编程(FP)各有其优势和适用场景,选择哪个更好取决于具体的业务需求、项目特点、团队熟悉度以及其他技术考虑。以下是两种范式的一些关键差异和考虑因素: ### 面向对象编程(OOP) - 优势: - 模型化:OOP很擅长模拟现实世界的实体和关系,使得代码更直观和易于理解。
在前端开发中,选择使用函数式编程而不是面向对象编程(使用类)的原因有几个,其中包括但不限于体积问题和树摇(Tree Shaking)的效率。以下是一些考虑因素: 体积和树摇(Tree Shaking):确实,函数式编程往往可以产生更加模块化的代码,这有助于工具更有效地进行树摇(Tree Shakin
在TypeScript中,void类型用于表示没有任何类型,通常用在函数的返回类型上,表示该函数没有返回值。这意味着,如果一个函数被标记为返回void,它不应该返回任何值。 理解void的关键点如下: 函数返回值:当一个函数的返回类型被指定为void时,这意味着这个函数不返回任何值。你可以在函数体内
在TypeScript中,接口(interface)是开放的,这意味着你可以在任何地方声明同名的接口,TypeScript编译器会自动将它们合并。这种特性被称为接口合并(Interface Merging)。你可以利用这个特性来扩展第三方库中的接口。 例如,如果你正在使用一个第三方库,它定义了一个接
TypeScript中的自定义类型守卫(Custom Type Guards)是一种特殊的函数或表达式,用于在运行时检查一个值是否属于特定的类型。通过使用类型守卫,TypeScript编译器能够在特定的作用域内准确地推断出值的类型,从而提供更严格的类型检查和更智能的代码自动完成等功能。 自定义类型守
在TypeScript中,Object和unknown类型都代表某种程度上的类型不确定性,但它们在类型安全性方面有着本质的区别: Object类型是一个非原始类型的顶级类型,它可以接受任何非原始(即非number、string、boolean、symbol、null或undefined)的值。使用O
千里马常有,而伯乐不常有,有机会我要去当这个伯乐 你想成为什么样的人,只要坚持你就能成为什么样的人,努力终可达 年龄不是限制,想做的事就去做,不要留遗憾 接下来的方向:学习、运动、挣钱、生活 两个学习目标:考架构师证书(软考)和全日制研究生(需要先挣钱,考上后才有时间去读书,这个排软考之后再开始准备
MyBatis日志管理 什么是日志? 日志文件是用于记录系统操作事件的记录文件或文件集合 日志保存历史数据,是诊断问题以及理解系统活动的重要依据 SLF4j与Logback 日志门面:Simple Logging Facade For Java(SLF4j) 和 Apache Commons-Log
上传文件使用表单数据提交时,有特殊字符导致报错时,可以将数据用json字符串传递 const start = item[i].chunk * chunkSize const end = Math.min(file.size, start + chunkSize)
这个社会是由钱驱动的,技术也是为钱服务的,没有业务技术也就不值钱了 程序员不应该死磕技术,应该用业务来驱动技术 一个人的精力终究有限,技术再高也只能创造有限的价值 要组团队,用钱驱动,创造无限的价值 在管理中,如果层级过多,那么很多人就会使用各种手段往上爬。所以,我认为管理应该扁平化,用钱来奖励员工
开始 什么是Typescript? 融合了后端面向对象思想的超级版的javascript语言,为javascript补充了类型系统 环境搭建 mkdir demo cd demo npm init -y npm i pnpm -g # 局部安装,也可以全局安装,但建议局部安装 pnpm add t
lerna官方文档:https://lerna.js.org/docs/getting-started pnpm官方文档:https://pnpm.io/ mkdir demo cd demo # 初始化lerna项目 pnpx lerna init --packages="packages/*"
挣钱只是游戏,活着就是胜利,健康才是目的,快乐才是真谛 人的精力是有限的,在有限的时间内,尽量把一件事做到极致 每天保持一小时学习,其他时间实践或休息,学是学不完的,做也是做不完的,休息是必要的!
程序员需要持续学习数学和英语 数学要学习与程序员相关的课程 英语需要达到能听懂,能阅读技术文档,当然最好听书读写都会! 学习总是有用的,或早或晚 一个人没必要把自己懂的东西都展现出来,人们不喜欢他们身边有什么人比他们懂得多
线上发布后,需要测试人员将开发修改影响到的测试用例全部跑一遍 开发环境和预发环境测试没问题,不代表生产环境没问题,数据和流程都可能不一样 每一个环节都有其作用,一个人不可能完成所有环节的事情,专业的事情还是交给专业的人员来完成 与其更好(内卷),不如不同(创新)
学习工具 IDE: VS Code VS Code插件:Extension Pack for Java 包管理:Maven 创建项目 打开vscode,点击创建java项目 选择使用maven创建项目
有些努力没用,但有些努力是有用的,方向要对! 目前来说人工智能还是靠算力枚举,网上没有的它就做不出来,比如这次阿里数学竞赛。我觉得人工智能需要做到自己出题自己做,题目还需要是真正有意义的,自己训练自己越来越强,才能达到真正的智能。 网络上的信息真假难辩,合理的怀疑是有必要的,但没有完整证据就上升到人
mybatis-db-1 | 2024-06-22T02:42:46.979693Z 0 [ERROR] [MY-013236] [Server] The designated data directory /var/lib/mysql/ is unusable. You can remove al
官方文档:https://mybatis.org/mybatis-3/zh_CN/index.html 什么是MyBatis? MyBatis是优秀的持久层框架; MyBatis使用XML将SQL与程序解绑,便于维护; MyBatis学习简单,执行高效,是JDBC的延伸; MyBatis开发流程 引