Set和Map & weakSet和weakMap
前言在我们ES5的开发过程中,我们很多时间都在使用array和object,数组的去重对象的遍历等等都是为手熟尔,在ES6又添加了Set和Map和弱类型weakSet和weakMap
详情1. Set集合是由一组无序且唯一(即不能重复)的项组成的,可以想象成集合是一个既没有重复元素,也没有顺序概念的数组操作方法:
add(value):添加某个值,返回 Set 结构本身。
delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
has(value):返回一个布尔值,表示该值是否为 Set 的成员。
clear():清除所有成员,无返回值。
size: 返回set数据结构的数据长度
123456789let setH=Set<number> =new Set([1,2,3,4]);setH.add(5);//Set(5) {1, 2, 3, 4, 5}setH.has(5) //truesetH.delete(5);//truesetH.size //4setH.clear(); //清除//去重操作let arr = [...ne ...
TypeScript进阶
类型兼容所谓的类型兼容性,就是用于确定一个类型是否能赋值给其他的类型。TypeScript中的类型兼容性是基于结构类型的(也就是形状),如果A要兼容B 那么A至少具有B相同的属性。
协变123456789101112131415161718192021222324interface A { name: string, age: number, isMan: boolean}interface B { name: string, age: number}let a: A = { name: 'hale', age: 22, isMan: true}let b: B = { name: 'yzj', age: 20}// a=b; //异常 类型 "B" 中缺少属性 "isMan",但类型 "A" 中需要该属性。b=a;
A B 两个类型完全不同但是 ...
TS进阶用法proxy & Reflect
前言对于接触过Vue3的开发差不多都知道ES6添加了Proxy新特性,数据响应的技术就是运用了Proxy的代理拦截,但是和Proxy共生的还有Reflect(反射).
开始proxy
Proxy 可以理解成,在目标对象之前架设一层“拦截”,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种机制,可以对外界的访问进行过滤和改写。Proxy 这个词的原意是代理,用在这里表示由它来“代理”某些操作,可以译为“代理器”。
下面是 Proxy 支持的拦截操作一览,一共 13 种-具体实例。
get(target, propKey, receiver):拦截对象属性的读取,比如proxy.foo和proxy['foo']。
set(target, propKey, value, receiver):拦截对象属性的设置,比如proxy.foo = v或proxy['foo'] = v,返回一个布尔值。
has(target, propKey):拦截propKey in proxy的操作,返回一个布尔值。
deleteProperty(target, prop ...
实战TS编写发布订阅模式
前言作为一个前端或多或少都知道发布订阅模式,那么他到底是什么呢?其实我们在日常开发早已用到了发布订阅模式例如addEventListener,Vue evnetBus
发布订阅模式又叫观察者模式,它定义了一种一对多的关系,让多个订阅者对象同时监听某一个发布者,或者叫主题对象,这个主题对象的状态发生变化时就会通知所有订阅自己的订阅者对象,使得它们能够自动更新自己。
举例:比如我们刷b站,关注了一个up主,他直播或者发新动向都会提醒呢,然后你就知道,我们关注就是订阅或者叫注册,当他有新动向的时候会提醒你,这就是发布,这里面有三个角色:发布者(up主)、订阅者(你自己)、调度者(平台)。
实现我们定义一个对象,对象有四个方法:
on:订阅/监听
emit:发布/注册
once:只执行一次
off:解除绑定
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869//定义类接口inter ...
TS-Rollup封装插件实践
前言使用cookie是可以设置有效期的,但localStorage本身是没有该机制的,只能手动删除,否则会一直存放在浏览器当中,我们可以把localStorage跟cookie一样设置一个有效期进行二次封装实现该方案。
在存储的时候设置一个过期时间,并且存储的数据进行格式化方便统一校验,在读取的时候获取当前时间进行判断是否过期,如果过期进行删除即可。
实现123456// /enum ts 定义枚举//字典 Dictionaries expire过期时间key permanent永久不过期export enum Dictionaries { expire = '__expire__', permanent = 'permanent'}
123456789101112131415161718192021//type ts 定义类型//expire 过期时间key //permanent 永久不过期import { Dictionaries } from "../enum ...
四种常见的JS内存泄漏
1、意外的全局变量未定义的变量会在全局对象创建一个新变量,如下。
123function foo(arg) { bar = "this is a hidden global variable";}
函数foo内部忘记使用var,实际上JS会把bar挂载到全局对象上,意外创建一个全局变量。
123function foo(arg) { window.bar = "this is an explicit global variable";}
另一个意外的全局变量可能由this创建。
1234567function foo() { this.variable = "potential accidental global";}// Foo 调用自己,this 指向了全局对象(window)// 而不是 undefinedfoo();
解决方法:
在 JavaScript 文件头部加上'use strict',使用严格模式避免意外的全局变 ...
前端开发总结方法
前言总结一下个人开发总封装的实用方法,以便后期开发方便
方法合并表格行在开发表格过程中,总是需要合并单元格子,后端会把相同的数据放在一起,前端处理合并,以下是利用哈希值处理的合并方法。
123456789101112131415161718192021222324252627282930313233343536373839404142//tableData 合并的表格数据,matchKey为匹配的key数组,可匹配多个function dealWithMergeData(tableData, matchKey) { let spanObject = {} //遍历匹配项 matchKey.forEach((spanKeyItem) => { if (!spanObject[spanKeyItem]) spanObject[spanKeyItem] = []; //起始索引 let startIndex = 0; //遍历表格数据 for (let i = ...
Rollup构建TS项目 & webpack构建TS项目 & esbuild + swc
Rollup构建TS项目Rollup 打包很快,体积很小,学习一下
配置环境
npm init -y 生成 package.json
tsc --init 生成 tsconfig.json
创建 rollup.config.js
创建入口问题/src/index.ts文件和public/index.html文件
安装依赖
全局安装rollup npm install rollup-g
安装TypeScript npm install typescript -D
安装TypeScript 转换器 npm install rollup-plugin-typescript2 -D
安装代码压缩插件npm install rollup-plugin-terser -D
安装rollupWeb服务 npm install rollup-plugin-serve -D
安装热更新 npm install rollup-plugin-livereload -D
引入外部依赖 npm install rollup-plugin-node-resolve -D
安装配置环境变量用来区分本地和生 ...
TypeScrip-学习(八)装饰器Decorator
装饰器 Decorator它是一项实验性特性,在未来的版本中可能会发生改变它们不仅增加了代码的可读性,清晰地表达了意图,而且提供一种方便的手段,增加或修改类的功能
启用实验性的装饰器特性,必须在命令行或tsconfig.json里启用编译器选项
1234567{//..."experimentalDecorators": true, "emitDecoratorMetadata": true, //...}
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上。学习点
类装饰器:ClassDecorator
方法装饰器:MethodDecorator
属性装饰器:PropertyDecorator
参数装饰器:ParameterDecorator
装饰器工厂
类装饰器定义一个类装饰器函数 他会把Http的构造函数传入你的Base函数当做第一个参数,注意是构造函数不是原型
优势:当原先的类有很多业务代码,无法全部理清,但是又需要添加新的方法或属性。因为迭代器返回的是构造函数,可以在回调方法 ...
TypeScrip-学习(七)命名空间、三斜线指令、声明文件、Mixins混入
命名空间 namespace在工作中无法避免全局变量造成的污染,TypeScript提供了namespace 避免这个问题出现
内部模块,主要用于组织代码,避免命名冲突。
命名空间内的类默认私有
通过 export 暴露
通过 namespace 关键字定义
TypeScript与ECMAScript 2015一样,任何包含顶级import或者export的文件都被当成一个模块。相反地,如果一个文件不带有顶级的import或者export声明,那么它的内容被视为全局可见的(因此对模块也是可见的)
实例
12345678910111213141516//命名空间中通过export将想要暴露的部分导出,否则无法读取其值namespace a { export const Time: number = 1000 export const fn = <T>(arg: T): T => { return arg } fn(Time)}namespace b { export ...