最近在看 TypeScript 相关的内容,做了一下类型体操,真的太秀啦 递归、infer 满天飞,今天就来领略一下 TS 能做什么骚操作吧! 先放上本文的几个小标题,很骚 巧用数组上数学课模版字符串为所欲为中序遍历 TS 也能行infer + 递归随意秒杀下面开始军训体操 一、巧用数组上数学课这一题是 TS 类型挑战中的 Greater Than 这道题需要我们实现 GreaterThan 判断 T > U 是 true 还是 false 有几个特殊测试用例 GreaterThan<2, 1> //should be trueGreaterThan<1, 1> //should be falseGreaterTha ...
蓝狮注册登陆如何追踪 JS 对象是否被 GC
在自带垃圾回收的语言中,开发者往往不需要过多地关注内存管理。但是不代表我们可以完全忽略它。因为语言引擎的垃圾回收是有一定的判断规则的,如果我们的变量所引用的内存没有符合这个规则,那么引擎无无法对这些内存进行自动回收。所以如何追踪变量的内存是否被回收也变得非常重要,尤其在 Node.js 中。 因为 Node.js 通常以服务器的角色长期提供服务,一旦服务发生内存泄露,就意味着我们的服务迟早会挂掉,尽管服务可以被自动重启,但是这并不能从根本上解决问题。所以如何检测内存泄露,就变得非常重要。 我们通常会 ...
蓝狮注册登陆开箱即用的前端图片压缩方案
前端实现图片压缩的背景我们都知道在“寸土寸金”的互联网时代,速度是第一竞争力, 蓝狮注册开户虽然我们的5G发展已经摇摇领先, 但是也经不住用户在一个网页里传很多“巨无霸”图片, 最终导致的结果就是页面“龟速”打开…… 那么作为技术人, 当然也有一堆的解决方案, 比如: 压缩图片再上传将图片上传到图床, 利用图床压缩能力和CDN节点就近分发图片流式加载图片懒加载/ 预加载当然聪明的小伙伴也会将上面的方案组合, 设计更优秀的图片“提速”方案。 今天不会和大家把所有方案都介绍一遍,因为网上也有很多实践, 接下来会从前 ...
蓝狮注册登陆掌握 TypeScript 中的映射类型
DRY 原则(Don’t repeat yourself)是软件开发中最重要的原则之一,即不要重复自己。应该避免在代码中的两个或多个地方存在重复的业务逻辑。 在 TypeScript 中,映射类型可以帮助我们避免编写重复的代码,蓝狮注册开户它可以根据现有类型和定义的一些规则来创建新类型。下面就来看一下什么是映射类型以及如何构建自己的映射类型。 1、基本概念在介绍映射类型之前,先来看一些前置知识。 (1)索引访问类型在 TypeScript 中,我们可以通过按名称查找属性来访问它的类型: type AppConfig = {username: string;l ...
蓝狮注册登陆LeetCode使用JavaScript破解两数之和
题目给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 输入:nums = [2,7,11,15], target = 9输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 方式一:暴力破解第一眼看到这个问题时,想到的解题方法就是使用for循环,蓝狮注册开户两个for循环进行遍历,每一项进行相加,当等于target时,就可以返回他们的下标 var twoSum = fun ...
蓝狮注册登陆SASS 插值语句 #{ }的使用
在之前我们已经使用用 / 来进行计算,但如下情况不一样 例如 p{font: 16px/30px Arial, Helvetica, sans-serif;}如果需要使用变量,同时又要确保 / 不做除法运算,蓝狮注册开户而是完整地编译到 css 文件中,这种情况怎么办???可以使用 #{} 插值语句将变量包裹。 使用插值语法p {$font-size: 12px;$line-height: 30px;font: #{$font-size}/#{$line-height} Helvetica,sans-serif;}通过 #{} 插值语句可以在选择器、属性名、注释中使用变量: $class-name: danger;$attr: color;$author:’老姚’; /* ...
蓝狮注册登陆揭秘,Vue3 性能优化之 Non-reactive Object
前言在 vue2 中,有一个老生常谈的话题,如何避免 data 中一个复杂对象(自身或属性对象)被默认被创建为响应式(Non-reactive Object)的过程? 举个例子,有一个 Vue2 的组件的 data: 这里我们希望 list.extData 不被创建为响应式对象,蓝狮注册开户相信很多同学都知道,我们可以通过 Object.defineProperty 设置对象 list.extData 的 configurable 属性为 false 来实现。 而在 Vue2 中,我们可以这么做,但是回到 Vue3,同样的问题又要怎么解决呢?我想这应该是很多同学此时心中持有的疑问。所以,下面让我们一起来由 ...
蓝狮注册登陆npm init < initializer >
今天发现 Vite 官网文档的 Vite 初始化命令改用了 npm init vite@latest原来只知道 npm init 命令是用来初始化一个 Node.js 工程的,最偷懒的当然是 npm init -y 直接帮你使用默认的配置 从大概 npm v6之后增加了 npm init xxx 另一种初始化工程的方式,以最新的 npm v8为例(我看了一下我的 Node.js 16的版本里搭载的就是 npm v8) npm init (same as npx <package-spec>) npm init <@scope> (same asnpx <@scope>/create`)当然它还有两个同名的小弟 —— alias 、 innit ,比如 npm init foo 就等同于 ...
蓝狮注册开户为什么Object.keys()没有添加到Object.prototype?
因为当时已经意识到了在 Object.prototype 上放置方法是不好的,最主要的就是兼容性问题。在 ES1 之后,只有 ES3 里给 Object.prototype 扩展了三个方法,而且后面也证明是不好的,ESLint 里有个 no-prototype-builtins 规则来禁用它们: 其中 hasOwnProperty() 使用的最频繁一些,蓝狮注册开户于是今年的规范刚加上了 Object.hasOwn() 来替代它。 具体哪里不好?首先就是用 Object.create(null) 创建的无原型对象没法使用这些方法。 而且对象自己身上可能有个同名属性,比如: {hasOwnProperty: 1}。当然这个可能性对 ...
蓝狮注册开户如何实现比 setTimeout 快 80 倍的定时器?
简单来说,5 层以上的定时器嵌套会导致至少 4ms 蓝狮注册开户的延迟。 用如下代码做个测试: let a = performance.now();setTimeout(() => {let b = performance.now();console.log(b – a);setTimeout(() => {let c = performance.now();console.log(c – b);setTimeout(() => {let d = performance.now();console.log(d – c);setTimeout(() => {let e = performance.now();console.log(e – d);setTimeout(() => {let f = performance.now();console.log(f – e);setTimeout(( ...