TypeScript(中)+算法(二)

news2024/12/30 1:56:32

文章目录

    • 算法
      • 排序
        • 冒泡排序
        • 选择排序
  • TS
    • 类型声明
    • 类型推断
    • 类型总览
      • js中的数据类型
      • ts中的数据类型
      • 原始类型和包装对象
        • 原始类型
        • 包装对象
        • 自动装箱
    • 常用类型与语法
      • any
      • unknown
      • never
      • void
        • void 与 undefined
        • 总结

算法

排序

有十种排序算法,分别是:冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,堆排序,基数排序,计数排序,桶排序。今天就先讲一下冒泡和选择

冒泡排序

冒泡排序就是俩个for循环。

内嵌的for是用来求出当前数组最大或最小的那个元素

第一层的for是用来循环查找次最大的元素直到全部排序好。

public class HelloWorld {
    public static void main(String []args) {
		
		int[] arr = {1,2,3,4,5,6,7};
		
		 System.out.println("arr的排序前:\n18  13  50  15  4  17  18 ");
		
		int temp  = 0 ;
		for(int i = 0 ;i< arr.length -1; i++){
			for(int j = 0; j<arr.length-1-i; j++){
				if(arr[j]>arr[j+1]){
					temp = arr[j];
					arr[j] = arr[j+1];
					arr[j+1] = temp;
				}
			}
			
		}
		 System.out.println("arr排序后:");
				
        for(int i = 0; i<arr.length; i++){
 
			 System.out.print(arr[i]+"\t");
		}	
		
		
      
    }
}
选择排序

选择排序是一种简单直观的排序算法。它的基本思想是每次从待排序的元素中选择最小(或最大)的元素,放置在已排序的部分的末尾,直到所有元素都排序完成。

public static void sort(int[] arrays) {
		for(int i = 0; i < arrays.length; i++) {
			int min = arrays[i];
			int temp = i;
			for(int j = arrays.length - 1; j > i; j--) {
				if(min > arrays[j]) {
					min = arrays[j];
					temp = j;
				}
			}
			arrays[temp] = arrays[i];
			arrays[i] = min;
		}

TS

类型声明

使⽤ : 来对变量或函数形参,进⾏类型声明:

let a: string //变量a只能存储字符串
let b: number //变量b只能存储数值
let c: boolean //变量c只能存储布尔值
a = 'hello'
a = 100 //警告:不能将类型“number”分配给类型“string”
b = 666
b = '你好'//警告:不能将类型“string”分配给类型“number”
c = true
c = 666 //警告:不能将类型“number”分配给类型“boolean”
// 参数x必须是数字,参数y也必须是数字,函数返回值也必须是数字
function demo(x:number,y:number):number{
 return x + y
}
demo(100,200)
demo(100,'200') //警告:类型“string”的参数不能赋给类型“number”的参数
demo(100,200,300) //警告:应有 2 个参数,但获得 3 个
demo(100) //警告:应有 2 个参数,但获得 1 个

在 : 后也可以写字⾯量类型,不过实际开发中⽤的不多。

let a: '你好' //a的值只能为字符串“你好”
let b: 100 //b的值只能为数字100
a = '欢迎'//警告:不能将类型“"欢迎"”分配给类型“"你好"”
b = 200 //警告:不能将类型“200”分配给类型“100”

类型推断

TS 会根据我们的代码,进⾏类型推导,例如下⾯代码中的变量 d ,只能存储数字

let d = -99 //TypeScript会推断出变量d的类型是数字
d = false 

类型推断不是万能的,面对复杂类型时容易推断出问题,还是尽量明确的编写类型声明

类型总览

js中的数据类型

  1. string
  2. number
  3. boolean
  4. null
  5. undefined
  6. object
  7. symbol
  8. bigint

其中object包含Array,Function,Date,Error等

ts中的数据类型

包括上述js类型之外还有几种新类型

  1. any
  2. unknown
  3. never
  4. void
  5. tuple
  6. enum

还有两个用于自定义类型的方式

  1. type
  2. interface

在js中的这些内置构造函数:Number,String,Boolean,用于创建对应的包装对象,在日常开发时很少使用,ts也是同理,所以在ts中进行类型声明时,通常都是用小写的number,string,boolean

let str1: string
str1 = 'hello'
str1 = new String('hello')

let str2: string
str2 = 'haaa'
str2 = new String('haaa')

console.log(typeof str1)
console.log(typeof str2)

原始类型和包装对象

原始类型

如number,string,boolean,在js中是简单数据类型,他们在内存中占用空间少,处理速度快

包装对象

如Number对象,String对象,是复杂类型,在内存中占用更多空间,在日常开发时很少由开发人员自己创建包装对象

自动装箱

js在必要时会自动将原始类型包装成对象,以便调用方法或访问属性

//原始类型
let str ='haaa'
let size=(function(){
    //1.自动装箱:创建一个临时的String对象包装原始字符串
    let tsObject = new String(str)
    //访问String对象的length属性
    let lengthValue = ts.length
    //销毁临时对象,返回长度值
    return lengthValue
    
})()
console.log(size)

常用类型与语法

any

任意类型,⼀旦将变量类型限制为 any ,那就意味着放弃了对该变量的类型
检查。

// 明确的表示a的类型是 any —— 【显式的any】
let a: any
// 以下对a的赋值,均⽆警告
a = 100
a = '你好'
a = false
// 没有明确的表示b的类型是any,但TS主动推断出来b是any —— 隐式的any
let b
//以下对b的赋值,均⽆警告
b = 100
b = '你好'
b = false

any 类型的变量,可以赋值给任意类型的变量

unknown

未知类型,适⽤于:起初不确定数据的具体类型,要后期才能确定
也可以理解为一个类型安全的any,unknown 会强制开发者在使⽤之前进⾏类型检查,从⽽提供更强的类型安全性。读取 any 类型数据的任何属性都不会报错,⽽ unknown 正好与之相反。

// 设置a的类型为unknown
let a: unknown
//以下对a的赋值,均符合规范
a = 100
a = false
a = '你好'
// 设置x的数据类型为string
let x: string
x = a //警告:不能将类型“unknown”分配给类型“string”

// 设置a的类型为unknown
let a: unknown
a = 'hello'
//第⼀种⽅式:加类型判断
if(typeof a === 'string'){
 x = a
 console.log(x)
}
//第⼆种⽅式:加断⾔
x = a as string
//第三种⽅式:加断⾔
x = <string>a

let str1: string
str1 = 'hello'
str1.toUpperCase() //⽆警告
let str2: any
str2 = 'hello'
str2.toUpperCase() //⽆警告
let str3: unknown
str3 = 'hello';
str3.toUpperCase() //警告:“str3”的类型为“未知”
// 使⽤断⾔强制指定str3的类型为string
(str3 as string).toUpperCase() //⽆警告

never

任何值都不是,即:不能有值,例如 undefined 、 null 、 ‘’ 、 0 都不⾏
⼏乎不⽤ never 去直接限制变量,因为没有意义。
never ⼀般是 TypeScript 主动推断出来的。
never 也可⽤于限制函数的返回值

/* 指定a的类型为never,那就意味着a以后不能存任何的数据了 */
let a: never
// 以下对a的所有赋值都会有警告
a = 1
a = true
a = undefined
a = null

 指定a的类型为string
let a: string
// 给a设置⼀个值
a = 'hello'
if (typeof a === 'string') {
 console.log(a.toUpperCase())
} else {
 console.log(a) // TypeScript会推断出此处的a是never,因为没有任何⼀个值符合此处的
逻辑
}

// 限制throwError函数不需要有任何返回值,任何值都不⾏,像undeifned、null都不⾏
function throwError(str: string): never {
 throw new Error('程序异常退出:' + str)
}

void

void 的含义是空,即:函数不返回任何值,调⽤者也不应依赖其返回值进⾏任何操作
void 通常⽤于函数返回值声明
在这里插入图片描述
那限制函数返回值时,是不是 undefined 和 void 就没区别呢?—— 有区别。因为还有
这句话 :返回值类型为 void 的函数,调⽤者不应依赖其返回值进⾏任何操作,对⽐下
⾯两段代码:
在这里插入图片描述

void 与 undefined

void 是⼀个⼴泛的概念,⽤来表达“空”,⽽ undefined 则是这种“空”的具体
实现。
因此可以说 undefined 是 void 能接受的⼀种“空”的状态。
也可以理解为: void 包含 undefined ,但 void 所表达的语义超越了 undefi
ned , void 是⼀种意图上的约定,⽽不仅仅是特定值的限制。

总结

如果⼀个函数返回类型为 void ,那么:

  1. 从语法上讲:函数是可以返回 undefined 的,⾄于显式返回,还是隐式返回,这⽆
    所谓
  2. 从语义上讲:函数调⽤者不应关⼼函数返回的值,也不应依赖返回值进⾏任何操作!
    即使我们知道它返回了 undefined。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2228921.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法定制LiteAIServer视频智能分析软件的过亮、过暗及抖动检测应用场景

在现代社会中&#xff0c;视频监控系统扮演着举足轻重的角色&#xff0c;其视频质量直接关乎监控系统的可靠性与有效性。算法定制LiteAIServer通过引入抖动检测和过亮过暗检测功能&#xff0c;为视频监控系统的稳定性和用户体验带来了显著提升。 以下是对这两种功能的技术实现、…

【隐私计算篇】全同态加密应用场景案例(隐私云计算中的大模型推理、生物识别等)

1.题外话 最近因为奖项答辩&#xff0c;一直在忙材料准备&#xff0c;过程非常耗费时间和精力&#xff0c;很难有时间来分享。不过这段时间虽然很忙碌&#xff0c;但这期间有很多新的收获&#xff0c;特别是通过与领域内专家的深入交流和评审过程&#xff0c;对密码学和隐私计算…

elasticsearch 8.x 插件安装(三)之拼音插件

elasticsearch 8.x 插件安装&#xff08;三&#xff09;之拼音插件 elasticsearch插件安装合集 elasticsearch插件安装&#xff08;一&#xff09;之ik分词器安装&#xff08;含MySQL更新&#xff09; elasticsearch 8.x插件&#xff08;二&#xff09;之同义词安装如何解决…

mac-ubuntu虚拟机(扩容-共享-vmtools)

一、磁盘扩容 使用GParted工具对Linux磁盘空间进行扩展 https://blog.csdn.net/Time_Waxk/article/details/105675468 经过上面的方式后还不够&#xff0c;需要再进行下面的操作 lvextend 用于扩展逻辑卷的大小&#xff0c;-l 选项允许指定大小。resize2fs 用于调整文件系统的…

2024 年 11 个最佳开源网络爬虫和抓取工具

用于网络爬行的免费软件库、软件包和 SDK?或者它是您需要的网络抓取工具吗? 嘿,我们是 Apify 。您可以在 Apify 平台上构建、部署、共享和监控您的抓取工具和爬虫。 来看看我们吧。 如果您厌倦了专有网络抓取工具的限制和成本,或者厌倦了被单一供应商锁定,开源网络爬虫和…

Centos安装ZooKeeper教程(单机版)

本章教程介绍,如何在Centos7中,安装ZooKeeper 3.9.3版本。 一、什么是ZooKeeper ? Apache ZooKeeper 是一个分布式协调服务,用于大型分布式系统中的管理和协调。它为分布式应用提供了一个高性能的通信框架,简化了开发人员在构建复杂分布式系统的任务。ZooKeeper 能够解决一…

检索引擎Elasticsearch

一.为什么要用Elasticsearch 由于我们在运行我们的项目的时候通常都是将数据存到mysql或者sql serve等数据库中&#xff0c;在进行数据搜索时使用sql 语句 like进行模糊匹配查询&#xff0c;其一&#xff1a;虽然可以查到数据&#xff0c;但是它模糊匹配查询速度较慢&#xff0…

CentOS9 Stream 支持输入中文

CentOS9 Stream 支持输入中文 方法一&#xff1a;确保 gnome-control-center 和相关组件已更新方法二&#xff1a;手动添加输入法源配置方法三&#xff1a;配置 .xinputrc 文件方法四&#xff1a;检查语言包 进入centos9 stream后&#xff0c;点击右上角电源键&#xff0c;点击…

基于PHP的http字段查询与注册(V1)(持续迭代)

目录 版本说明&#xff1a; 实现环境&#xff08;WAMP&#xff09;&#xff1a; 数据库链接 查询页面 php处理逻辑 字段添加 版本说明&#xff1a; 该查询功能以查询http首部字段为目的实现的字段属性、字段内容的查询&#xff0c;以及对新字段信息的数据注册。 v1实现…

无人机之集群控制方法篇

无人机的集群控制方法涉及多个技术和策略&#xff0c;以确保多架无人机能够协同、高效地执行任务。以下是一些主要的无人机集群控制方法&#xff1a; 一、编队控制方法 领航-跟随法&#xff08;Leader-Follower&#xff09; 通过设定一架无人机作为领航者&#xff08;长机&am…

jenkins搭建及流水线配置

1.安装docker curl https://mirrors.aliyun.com/repo/Centos-7.repo >> CentOS-Base-Aliyun.repomv CentOS-Base-Aliyun.repo /etc/yum.repos.d/yum -y install yum-utils device-mapper-persistent-data lvm2yum-config-manager --add-repo http://mirrors.aliyun.com/…

Python+Playwright(Nuitka、Pyinstaller打包)

安装驱动 playwright install # 这个安装所有默认的浏览器 playwright install chromium # 一般只装这一个浏览器就够了&#xff0c;要是装另外两个浏览器&#xff0c;后面的参数名可以修改查看各个驱动的位置 playwright install --dry-run创建打包目录 在运行的包里面…

一篇文章理解CSS垂直布局方法

方法1&#xff1a;align-content: center 在 2024 年的 CSS 原生属性中允许使用 1 个 CSS 属性 align-content: center进行垂直居中。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewpo…

《鸿蒙生态:机遇与挑战并行,创新引领未来》

《鸿蒙生态&#xff1a;机遇与挑战并行&#xff0c;创新引领未来》 一、鸿蒙生态崛起&#xff1a;机遇涌现&#xff08;一&#xff09;技术创新引领潮流&#xff08;二&#xff09;市场潜力巨大 二、抓住机遇的策略&#xff08;一&#xff09;开发者的黄金时代&#xff08;二&a…

Fakelocation 步道乐跑(Root真机篇)

前言:需要 Fakelocation&#xff0c;真机Root,步道乐跑&#xff0c;Dia&#xff0c;MT管理器系统需求 Fakelocation | MT管理器 | Dia | 环境模块 任务一 真机Root&#xff08;德尔塔&#xff0c;过momo&#xff0c;刷环境模块&#xff09; 任务二 前往Dia查看包名&#xff08…

docker离线安装达梦数据库

文章目录 下载达梦数据库docker镜像上传DM8镜像文件将DM8镜像导入到本地docker镜像仓库中查看本地docker镜像仓库是否存在DM8镜像带参数启动DM8docker启动DM8默认用户名/密码 下载达梦数据库docker镜像 达梦数据库官网 https://www.dameng.com/ 点击下载中心&#xff0c;选择D…

SD教程 ControlNet之OpenPose

ControlNet 是神经网络结构&#xff0c;用于控制预训练的大型扩散模型&#xff0c;以支持额外的输入条件。ControlNet 以端到端的方式学习任务特定的条件&#xff0c;即使训练数据集很小&#xff08;< 50k&#xff09;&#xff0c;学习也是稳健的。此外&#xff0c;训练一个…

HarmonyOS:自定义组件冻结功能

一、简介 自定义组件冻结功能专为优化复杂UI页面的性能而设计&#xff0c;尤其适用于包含多个页面栈、长列表或宫格布局的场景。在这些情况下&#xff0c;当状态变量绑定了多个UI组件&#xff0c;其变化可能触发大量UI组件的刷新&#xff0c;进而导致界面卡顿和响应延迟。为了提…

智慧工地:标准化、信息化、数字化与智能化的融合与实践

智慧工地&#xff0c;作为智慧地球理念在工程领域的具体实践&#xff0c;代表了一种全新的工程全生命周期管理方式。 智慧工地是建筑行业数字化转型的重要方向&#xff0c;它通过应用物联网、大数据、云计算、人工智能等新兴技术&#xff0c;对建筑工地进行数字化、信息化、智…

网络编程 TCP编程 Linux环境 C语言实现

所有基于数据传输通信的程序&#xff0c;都会被分成两种角色&#xff1a; 1. 服务端&#xff1a;又称为服务器 server 提供一种通信服务的进程 基本工作过程是&#xff1a;1> 接收请求数据 2> 处理请求数据 3> 发送处理结果 2. 客户端&#xff1a;client 使用一种通…