关于HarmonyOS的学习

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是一个后端环境
        + 使用的语言是JavaScript
        api接口类型
        + 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 = o2
    o2.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 = number
     let num: zt_number = 10
     let price: zt_number = 12.66
     let 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: string
            age: number
            sex: string
            say?(): number
        }
        interface Person2 extends Person {
            like: string
        }
        let obj3: Person2 = {
            name: '陈',
            age: 18,
            sex: '男',
            like: '篮球',
            say(){
                return 10
            }
        }
        console.log(obj3)

8.类型推论(有些类型不写,ts系统会默认给你进行推论它到底是什么类型的,因此工作中很多的情况下,可以偷懒)

        //声明变量并初始化时,推荐使用类型 
        let timer
        timer = 10
        timer = 'hello'
        timer = true

决定函数返回值时,返回值类型可以偷懒不写,自己进行推论。但是函数形参的类型不能省略,因为它也属于变量初始化 注意点:所谓的推论机制,是建立在已经有初始值的情况下进行的。

9.类型断言(有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型)

    // 类型断言:有时候你会比 TS 更加明确一个值的类型,此时,可以使用类型断言来指定更具体的类型
     let link = document.querySelector('.link') as HTMLAnchorElement
     console.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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值