day37
一、review
npm包管理器+ 常见问题=> 包下载出错-> 镜像源地址问题,是默认在国外,由于网速问题导致下载不下来,有时候下载一些包,然后由于各种的原因,一直下载不出来,需要清除缓存-> npm config set registry https://registry.npm.taobao.org=> 使用某些npm工具的时候发现报错-> node版本问题-> 如果有版本问题,你升级自己的node版本,换其他的工具=> 在实际开发中,一些比较老的项目,你使用npm i的时候下载包出错-> node版本太高了,需要降node版本-> nvm npm管理工具,你需要先使用npm按照nvm,然后就可以使用nvm下载不同的node版本,最终可以使用nvm随意切换不同的node版本+ nrm npm切换镜像源的工具=> 查看各个镜像源的网速=> 可以切换到不同的镜像源 nrm use 镜像源 === npm config set registry https://registry.npm.taobao.org+ 常见的镜像源地址=> npm 官方原始镜像网址是:https://registry.npmjs.org/=> 淘宝 NPM 镜像:http://registry.npmmirror.com=> 阿里云 NPM 镜像:https://npm.aliyun.com=> 腾讯云 NPM 镜像:https://mirrors.cloud.tencent.com/npm/=> 华为云 NPM 镜像:https://mirrors.huaweicloud.com/repository/npm/=> 网易 NPM 镜像:https://mirrors.163.com/npm/=> 中国科学技术大学开源镜像站:http://mirrors.ustc.edu.cn/=> 清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/node+ node是一个后端环境+ 使用的语言是JavaScriptapi接口类型+ get=> get接口一般用于一些免费的接口=> get请求可以直接在浏览器地址栏发送请求,查看接口+ post+ put+ delete
二、TypeScript
+ 这个语言是从JavaScript语言上升级而来的,解决了js本身存在的一些问题,js最大的问题就是没有类型检测系统,一个数据类型有没有问题只能到最终查看结果的时候才能知道+ TypeScript,简称ts,增加了类型检测系统,可以让数据类型在编译阶段就能发现是否存在问题+ HarmonyOS里面使用的语言是arkTS,而arkTS就是使用了TypeScript+ TypeScript最终还是需要编译成JavaScript来使用,因为浏览器只能识别JavaScript+ TypeScript其实就是对js代码最终的运行提供了一种保障,类似于生活中的社保ts使用+ 把之前的后缀名为.js现在改成.ts+ ts不能直接在浏览器里面运行,所以需要安装插件,把ts编译成js代码,再去运行 vite脚手架+ vite是一个自动化构建工具+ 作用=> 帮助咱们快速创建一个项目=> 自身存在服务器,如果发送请求什么的话,不需要使用live server插件=> 可以打包压缩代码
三、垃圾回收机制
1.标记清理 垃圾回收程序运行时,会标记内存中存储的所有变量(标记方法有多种).然后他会将所有在作用域的变量,以及被变量引用的变量的标记去掉.在此之后,被标记的变量就等待被删了.随后垃圾回收机制会运行一次,清理标记的值且收回被占用的内存.
2.引用计数 对每个值都记录它被引用的次数,但是弊端太多已经被放弃.
// 创建一个对象person, person指向一块内存空间, 该内存空间的引用数 +1 let person = {age: 22,name: 'ifcode' } let p = person // 两个变量指向一块内存空间, 该内存空间的引用数为 2 person = 1 // 原来的person对象被赋值为1,对象内存空间的引用数-1,// 但因为p指向原person对象,还剩一个对于对象空间的引用, 所以对象它不会被回收 p = null // 原person对象已经没有引用,会被回收
但它却存在一个致命的问题:循环引用。
如果两个对象相互引用,尽管他们已不再使用,垃圾回收器不会进行回收,导致内存泄露。
function cycle() {let o1 = {}let o2 = {}o1.a = o2o2.a = o1 return "Cycle reference!" } cycle()
四、ts的相关类型
1.类型注解(就是给一个变量添加类型约束。每声明一个变量,必须给变量添加类型,这个特性和java或者c里面很像) 当有了类型注解后,如果重新赋值的数据类型和类型注解的不一样,会给咱们一个提示 当有了类型注解后,直接赋值的时候也会进行类型检测,如果不满足给一个提示 注意点: + 当类型注解触发是,检测到赋值的类型和类型注解的不同时,给了一个温馨提示。如果执意要查看结果,其实也可以正常编译,得到结果 + ts只是在过程中给提示,让你避免代码错误,起了一个劝导的作用
2.函数类型(函数类型指定类型主要是给形参和函数返回值指定类型,并不是直接给函数本身指定类型)
注意点:①如果函数指定了返回值类型,那么必须按照要求返回对应的数据类型 ②如果一个函数指定的返回值类型是void,那么不要写返回值 ③? 表示可选参数,这个参数可以有,也可以没有
3.联合类型(可以一次性指定一个变量同时可以有几个不同的类型,让类型有一个范围) let desc: number | string | boolean = 10
4.数组类型(数组类型限定的是数组元素的类型,而不是数组本身的类型) let arr1: number[] = [10, 20, 30] let arr5: Array<string | number> = [10, 'hello'] let arr6: any[] = [10, 20, 'hello']
5.类型别名和对象类型(可以给一个类型取名称,达到复用的目的,类似于声明变量)
// 声明了一个类型别名,但是实现了复用的目的type zt_number = numberlet num: zt_number = 10let price: zt_number = 12.66let count: zt_number = 10
对象类型(如果一个变量或者属性类型没有指定的话,那么它的类型就是默认推论出来的)
let person1: {name: string,age: number,sex: string } = {name: '张',age: 18,sex: '男' } let person2: {name: string,age: number,sex: string } = {name: '陈',age: 20,sex: '男' }
6.never类型(never 是其它类型,代表从不会出现的值,表示永远也不会出现的值,一般用于处理错误信息)
// 注意点:throw new Error表示抛出错误信息,已经发送异常啦,因此符合never类型的规范// function errFn(): never{// throw new Error('报错了')// }// let desc: never// desc = errFn()
7.interface接口(和类型别名作用是一样的,但是语法和特性不一样,接口可以继承,类型别名无法继承)
在工作中,如果遇到既可以使用接口也可以使用类型别名的情况,你自己分析是否存在继承的情况,如果有就使用接口,没有就使用类型别名
interface Person {name: stringage: numbersex: stringsay?(): number}interface Person2 extends Person {like: string}let obj3: Person2 = {name: '陈',age: 18,sex: '男',like: '篮球',say(){return 10}}console.log(obj3)
8.类型推论(有些类型不写,ts系统会默认给你进行推论它到底是什么类型的,因此工作中很多的情况下,可以偷懒)
//声明变量并初始化时,推荐使用类型 let timertimer = 10timer = 'hello'timer = true
决定函数返回值时,返回值类型可以偷懒不写,自己进行推论。但是函数形参的类型不能省略,因为它也属于变量初始化 注意点:所谓的推论机制,是建立在已经有初始值的情况下进行的。
9.类型断言(有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型)
// 类型断言:有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型let link = document.querySelector('.link') as HTMLAnchorElementconsole.log(link)使用console.dir()查看标记的详细信息console.dir(link)let a = document.querySelector('a')
10.字面量和枚举
①字面量
type Direction = '上' | '下' | '左' | '右' function fn(direction: Direction){console.log(direction)}fn('上')fn('下')fn('右')fn('左')
②枚举(定义一组命名常量。它描述一个值,该值可以是这些命名常量中的一个,定义的这些常量,如果不进行赋值操作,默认值是从0开始的)
// enum Direction {Up, Down, Left, Right} // enum Direction {Up=2, Down, Left, Right} enum Direction {Up='上', Down='下', Left='左', Right='右'} function fn(direction: Direction){console.log(direction) } // fn(Direction.Up) fn(Direction.Down)
11.typeof类型推断(根据你传递进来的数据来推导你的值的类型的,typeof没有把类型固定化,是根据你自己传递的值来确定值的类型)
function formatPoint(point: typeof p) {// console.log(point) } formatPoint(p)