# 2022/04/10 TypeScript_Study_Day3
### TypeScript变量声明
**本质:**
申请一块内存地址存储值
#### 变量命名规则
- 变量名称可以包含数字和字母
- 除`_`和`$`符号外,不能包含其他特殊字符,包括空格
- 变量名不能以数字开头
#### 变量的几种声明方式
##### 声明时赋值
`
var message:string = "HelloWorld"
`
##### 声明变量不赋值--->值会被设置为`undefined`
`
var message:string
`
##### 声明变量并赋值不设置类型--->类型会被设置为`Any`
`
var message = "HelloWorld"
`
##### 单纯声明变量--->类型会被设置为`Any`,初始值设置为`undefined`
`
var message
`
#### 类型断言(Type Assertion)
**作用:**
手动指定一个值的类型,允许变量从一种类型变更为另一种类型
这里的变量更改类型是指编译器认为该变量变成了另一种类型
**示例代码:**
`
var str = "1"
var str1:number = <number><any>str
console.log(str1)
`
**注意:**
1. 当`S`类型是`T`类型的子集,或者`T`类型是`S`类型的子集时,`S`能被成功断言成`T`
2. 这不是类型转换
#### 类型推断
**示例:**
`
var num = 2
`
编译器自动类型推断为`number`类型变量
#### 变量作用域
- 全局变量 --->在类之外
- 实例变量 --->在类之内,方法之外
- 静态变量 --->`static`修饰,在类之内,方法之外
- 局部变量 --->在方法内
**举例:**
`
// global variable
var global_num:number = 18
class Numbers{
// Instance variable
num_val:number = 15
// Static variable
static sval:number = 12
sort(num:number[]):number[] {
if(num.length < 0) {
return
}
// Local variable
var init:number = 0
var i:number
var j:number
for(i = init; i < num.length; i++) {
for(j = i+1; j < num.length; j++) {
if(num[i] > num[j]) {
var temp = num[i]
num[i] = num[j]
num[j] = temp
}
}
}
return num
}
}
var ay:number[]
ay = [3,5,9,1,2]
var obj = new Numbers
console.log(obj.sort(ay))
`
### TypeScript运算符
和`java`或者`go`的运算符没什么两样,所以注意一些记忆模糊的即可
#### 位运算符
- &:and --->位运算符,将两个十进制数转为二进制比较两个二进制数的每一位,只有两个数的二进制位都为1结果才为1否则为0(转为二进制数以后长度要等长)
- !:or --->位运算符,将两个十进制数转为二进制比较两个二进制数的每一位,两个数的二进制位有一个为1结果就为1(转为二进制数以后长度要等长)
- ~:取反 --->将一个十进制数转为二进制,然后对每一位取反,0变为1,1变为0
- ^:异或 --->将两个十进制数转为二进制,等长,对每一位执行逻辑异,按位或操作,操作的结果是如果某位不同则该位为1,否则为0
- `<<`:左移 --->符号左边的数转为二进制,右边的数决定移动多少位,如:5<<1是0101各个位向左移1位,高位丢弃,低位补0
- `>>`:右移 --->与左移一直,只是改变了移动方向
- `>>>`:无符号右移 --->与有符号右移类似,除了左边一律使用0补位
#### 类型运算符
返回操作数的类型
**示例代码:**
`
var message:string = "HelloWorld"
console.log(typeof message)
`
- `instanceof`为指定运算符 --->判断对象是否为指定的类型