基本类型,包括布尔、数值、字符/字符串、null、动态类型(any/dynamic)等最基础的数据类型,有时有叫原始类型,类型名称一般使用小写。C#和TS,在这块有几个差异,一是字符串,二是null、三是JS/TS独有的几个基本类型,如undefined、void、symbol。
一、布尔
布尔类型只有两个值,true和false。C#中的布尔类型关键词是bool,而JS/TS/UTS中是boolean。
//C#================================================================================
bool a = true;
var b = false;
//TS和UTS===========================================================================
let a:boolean = true;
let b = false;
//***UTS和和C#在逻辑判断时,条件只能是true或false=====================================
//***JS和TS在逻辑判断时,条件存在自动转换=============================================
//0、""、null、undefined、false,自动转换为false
//其它如true、数值、字符串、数组、对象、函数,自动转换为true
if(1){
//执行此处代码,因为1被判断为true
}else{
}
二、字符/字符串
C#中字符类型char是值类型,字符串类型string是引用类型,但string具有值类型的特征。而JS/TS/UTS中,只有字符串类型string,且是值类型。
//C#中的字符和字符串=================================================================
char a = 'c'; //单个字符,只能使用单引号
string b = "abc"; //只能使用双引号
var c = "abc"; //类型推断
//TS和UTS中的字符串==================================================================
let s1:string = "abc"; //即可以使用单引号,也可以使用双引号,全栈建议双引号
let s2 = "abc"; //类型推断
//开发UTS插件需注意==================================================================
//1、iOS平台有NSString字符串类型
let nstr = NSString(string="abc") //定义NSString类型
let nss1 = s1 as NSString //string转NSString,也可以使用 NSString(string=s1)
let str = nstr as string //NSString转string,也可以使用 String(nstr)
//2、Android平台的Char类型是值类型,string是引用类型,string是char组成的不可变数组
let cstr1 = "hello".toCharArray() //string转CharArray
let cstr2 ="hello".toCharArray()[0] //string转CharArray,并截取第1个字符
let str1 = cstr1.joinToString("") //CharArray转string
三、数值类型
3.1 C#的数值类型
/*C#中的数值类型划分比较多,数值范围和精度依次增加=====================================
字节:byte, ubyte(有符号,byte很不一样)
短整数:short, ushort(无符号)
整数:int, uint(无符号)
长整数:long, ulong(无符号)
单精浮点:float
双精浮点:double
十进浮点:decimal
*/
short a = 10;
float b = 1.2;
var a = 10; //自动推断为int
var b = 1.0; //自动推断为double
int binaryVar = 0b1010; //0b 表示二进制
int hexVar = 0x10; //0x 表示十六进制
//数值类型转换======================================================================
//隐式转换,小范围的转为大范围的
short a = 123;
int b = a;
//显式转换,大范围转为小范围,存在精度损失和数值错误的风险
double a = 123.0
int b = (int)a
3.2 JS/TS的数值类型
//JS/TS中的数值类型有number和bigint两种数值类型
//number类型
let a:number = 42
let b:number = 3.14159
let c = 42
let binaryVar = 0b1010; //0b表示二进制
let hexVar = 0x10; //0x表示十六进制
//大整形bigint
const bigNumber: bigint = BigInt(9007199254740991);
const bigNumber1: bigint = 9007199254740991n;
3.3 UTS的数值类型
//使用number拉齐三端,Android端利用Number实现,iOS端利用NSNumber实现===================
let a:number = 42
let b:number = 3.14159
let c = 42
let binaryVar = 0b1010; //0b表示二进制
let hexVar = 0x10; //0x表示十六进制
//但UTS插件开发时,需要使用到平台专有数据类型==========================================
//1、各平台专有类型-----------------------------------------------
//Android端(Kotlin)专有类型,和c#相似,U开头的为无符号
Byte、UByte、Short、UShort、Int、UInt、Long、ULong、Float、Double
//iOS端(swift)专有类型,Int32和Int64可以统一使用Int,
Int8、UInt8、Int16、UInt16、Int、UInt、Float、Double
(Int32、UInt32、Int64、UInt64)-等价Int和UInt、Float32-等价Float、Float64-等价Double
//JS平台也有一个专有类型
BigInt
//跨端的话有几个类型比较常用
Int、Float、Double,Byte/UByte/Int8/UInt8
//2、定义专用类型------------------------------------------------
// #ifdef APP-ANDROID
let a:Int = 3
let c:Double = a * 1.0 / b
let d2 = (100 as Number).toFloat()
let e:Byte = 127 // 变量范围为 -128至+127 如果超出此范围会报错
// #endif
//3、字面量推导规则------------------------------------------------
let a = 1 // 类型为number
let b = 1/10 // 类型为number,值为0.1
let a:Int = 1 // 类型为Int
//以下能正确执行,纯数字字面量的除法类型被推断为number
function test(score: number): boolean {
return (score>=60)
}
test(1/10)
//以下报错
function test(score: Double): boolean {
return (score>=60.0)
}
test(1.0/10)
//需要修改为
function test(score: Double): boolean {
return (score>=60.0)
}
test((1.0 as Double)/10)
//4、将平台专有类型转换为number---------------------------------
let a: Int = 12
let b = Number.from(a)
//5、将number类型转换为平台专有类型-----------------------------
//方法A:使用as
let a = 123
let b:Int = a as Int
//方法B:使用Number对象的实例方法,所有专有类型都有一个相应的toXxx()方法
let a = 123
let b:Int = a.toInt()
四、null(类型?值?)
C#中,null不是一种类型,而是一个特殊值,只能赋值给引用类型或者可空的值类型。JS/TS/UTS中,null是一种数据类型,类型名称为null,typeof的结果为object,同时这个类型只有一个值,值就是null。TS(严格模式)和UTS中,null值只能赋值给引用类型或可空的值类型。
//C#中null的使用=====================================================================
string str = null; //定义一个可为空变量并赋值为 null,string是引用类型,可以赋值null
if (str == null) //也可以使用表达式:is null/is not null
{
Console.WriteLine("对象为 null");
}
int? nullableInt = null; // 可以将可空值类型赋值为 null
nullableInt = 10;
// 可以使用 HasValue 属性检查可空类型是否有值
if (nullableInt.HasValue)
{
Console.WriteLine("Nullable int has value: " + nullableInt.Value);
}
else
{
Console.WriteLine("Nullable int has no value");
}
//TS和UTS中使用null==================================================================
//1、type自定义类型==========
type obj = {
name : string,
age : number | null,
sex ?: boolean
}
//2、vue的选项式API==========
export default {
data() {
return {
n4 : null as number | null
}
}
}
//3、访问可空类型==========
//方法A:判断一下
let a:string|null = null
if (a != null) {}
//方法B:?运算符,可以连续使用
console.log(a?.length)
bob?.department?.head?.name
//空值合并,??运算符,大多数语言都一样
let a:string|null = null
let b = a??"hello"
//非空断言,!运算符,明确知道有值时使用,大多数语言都一样
const l = b!.length
五、动态类型(dynamic/any/object)
JS是动态语言,所有类型都可以在运行时确定,安全和性能上都存在一些问题。所以TS为JS带来编译时的类型化,在开发和编译阶段强类型化,提前发现问题,但仍然保留了一个any类型,在运行时确定类型。C#也有类似功能,dynamic类型。无论在TS还是在C#中,动态类型都应该少用。
//1、C#中dynamic和object的使用=======================================================
//dynamic--------------------
dynamic obj = 10;
Console.WriteLine(obj);
obj = "Hello";
Console.WriteLine(obj);
//object---------------------
//如果参数类型不确定,建议定义为object类型,因为任何值都可以赋值给object
//object有装箱拆箱的性能问题,但不会有安全问题
public void Func(object obj){}
//2、TS/UTS中使用any================================================================
//最后才确定类型,这样使用很容易出错,应该避免这种用法------------
let notSure: any = 4
notSure = "maybe a string instead"
//最常使用是用于定义一个多类型成员的数组-------------------------
let list: any[] = [1, true, "free"];
list[1] = 100;
//***注意:null不能赋值给any-----------------------------------
六、symbol、undefined和void(TS)
//1、symbol=========================================================================
const mySymbol = Symbol('mySymbol'); //只能通过Symbol创建,类似BigInt
const obj = {
[mySymbol]: 'This is associated with the symbol' //mySymbol作为唯一键名
};
console.log(obj[mySymbol]);
//vue的provide/inject,会时常用于symbol
//2、undefined=======================================================================
/*
undefined,JS和TS中可用,表示未定义
UTS中去除了undefined(但ArkTS中保留了下来)
它和null一样,是一种类型,类型名就叫undefined,这个类型下也只有一个值,undefined
*/
//3、void============================================================================
//C#中,void是方法修饰词,而在TS中,void是一种类型,所以可以在泛型中使用
function doSomething<T extends void>(param: T): void {
...//这里对可能为空类型的参数进行一些操作
}
doSomething(undefined);