文章目录
变量,常量
//TypeScript JavaScript
//1.类型 2.面向对象的
//输出语句
let personName = "涛涛";
document.write(personName);
//const声明的是常量
const tmp = "我是常量";
//类型限制
let personName2:string= "涛涛2";
document.write(typeof(personName2))
变量类型
undefined
//undefined:声明了一个变量,还没有赋值
let tmp:number;
document.write(tmp + ""); //undefined
any
//any代表任何值都可以存
let tmp:any = false
tmp = 2;
document.write(tmp)
tmp = "123";
document.write(tmp)
tmp = false;
document.write(tmp)
array数组
//array
//类型相同,含义相同
let a:string[] = ["1","2","3"];
//因为document.write必须打印string,所以我们要给array转string,用+来变更类型
document.write(a+"")
枚举
//枚举 自己定义一个属于自己的类型
enum Color{
red,
blue,
green
}
enum State{
idle,
run,
death,
attack
}
let color:Color = Color.green;
let state:State = State.idle;
//使用演示
switch(state){
case State.idle:
console.log("站立")
break;
case State.run:
console.log("奔跑")
break;
case State.death:
console.log("死亡")
break;
case State.attack:
console.log("攻击")
break;
default:
console.log("其他状态")
}
注意script
细节扩展
插值语法
// +号插入
let tmp:number = 3;
document.write('这个数字是' + tmp); //这个数字是3
// ${变量} 语法不再支持
let tmp:number = 3;
document.write('这个数字是${tmp}'); //这个数字是${tmp}
同时支持两种类型
let tmp:number|string = 3;
tmp = "测试";
typeof
let a = 2
console.log(typeof a)
类型别名
//类型别名,定义一个自己的类型别名
type NewNumber = number;
let num:NewNumber = 3;
console.log(num) //number
循环遍历
foreach(遍历)
of
//遍历内容
let names:string[] = ["小红","小明"]
for(let tmpName of names){
console.log(tmpName) //小红,小明
}
in
//遍历索引
let names:string[] = ["小红","小明"]
for(let tmpName in names){
console.log(tmpName) //0,1
}
函数
返回值写法
//无返回值,void可以省略
function add(num:number):void{
console.log(num)
}
let test = add(2)
匿名函数
//匿名函数
let add = function():number{
return 1 + 2;
}
console.log(add)
箭头函数
//箭头函数
let add2 = (num1:any,num2:any):number => {
return num1 + num2;
}
console.log(add2)
面向对象
基础class
//定义类
class Person{
name:string = "默认"
age:number = 0
say(){
console.log(this.age)
}
}
//实例化对象
let a = new Person();
console.log(a.name) //默认
a.say() //0
构造器
//构造函数与java一样,默认一个无参构造器
class Person{
name:string = "默认"
age:number = 0
//注意只能写一个构造器
//两个参数构造器
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
say(){
console.log(this.age)
}
}
//实例化对象
let a = new Person("我",18);
console.log(a.name) //我
a.say() //18
静态属性、方法
//静态与java一样
class Person{
//静态属性
static des:string = "这是一个person类"
//静态方法
static callPerson(){
console.log('你使用了静态方法')
}
name:string = "默认"
age:number = 0
//注意只能写一个构造器
//两个参数构造器
constructor(name:string,age:number){
this.name = name;
this.age = age;
}
say(){
console.log(this.age)
}
}
console.log(Person.des)
Person.callPerson();
封装
//封装
class Person{
private _name:string;
set name(value){
this._name = value;
}
get name(){
return this._name
}
}
let a = new Person();
a.name;
继承与抽象类
继承
super错误用法
//继承
//人类class
class Person{
name:string = "人类"
age:number = 0
say(){
console.log(this.age)
}
}
//学生class
class Student extends Person{
name:string = "学生"
say0(){
console.log(this.name)
}
say1(){
console.log(super.name)
}
}
let stu = new Student();
stu.say0() //学生
stu.say1() //undefined
super正确用法
//继承
//人类class
class Person{
name:string = ""
age:number = 0
say(){
console.log(this.name)
}
}
//学生class
class Student extends Person{
say(){
super.say()
}
}
let stu = new Student();
stu.name = "学生"
stu.say() //学生
抽象类
//抽象类,不能被实例化,但是可以被继承
//人类class
abstract class Person{
name:string = ""
age:number = 0
run(){
}
//这个方法子类必须实现,需要返回值
abstract say():void;
}
//学生class
class Student extends Person{
//实现父类的抽象方法
say(){
console.log("say hello")
}
}
//实例化,可以这样写,但是没必要,可以看得清楚一点而已
let a:Person = new Student()
a.say();
接口
//接口就是抽象类,只不过默认属性和方法全部都是抽象的
命名空间
//a b
//两人代码冲突问题
namespace aa{
export class Person{
name:string = '刘';
}
}
namespace bb{
export class Person{
name:string = '张';
}
}
//尝试实例化Person
let person = new aa.Person();
let person2 = new bb.Person();
泛型
//T泛型代表任何类型
function add<T>(num:T):T{
if(typeof num == "number"){
num++
return num;
}
return num;
}
console.log(add<number>(3) + "") //4
console.log(add<string>("3")) //3
元组,数组,字典
//元组
let hero:[string,number] = ["超人",100];
hero[0] = "蝙蝠侠"
console.log(hero[0])
//数组
let array1:number[] = [1,2,3]
let array2:Array<number> = new Array<number>();
//在数组后面追加元素
array1.push(4)
//在数组前面添加元素
array1.unshift(0)
//删除(取出)最后的元素
array1.pop()
//从第几位开始删除几个
array1.splice(0,1)
//删除(取出)最前面的
array1.shift();
//合并两个数组为array1
array1 = array1.concat(array2)
//查找元素位置
let index = array1.indexOf(3); //2
console.log(index)
//排序
array1.sort();
//翻转
array1.reverse();
//["a","b","c"] key value 0:"a" 1:"b" 2:"c"
//字典
//就是不想用原来的索引key 0,1,2...然后自定义索引
let dic:{[key:string]:string} = {
"name":"王小虎",
"name2":"李逍遥"
}
dic["name3"] = "令狐冲"
console.log(dic["name3"]) //令狐冲
回调
无参
//回调函数
function func1(value:Function){
//调用函数
//先做一些事情后,再调用回调函数
console.log(1 + 1)
value();
}
func1(test)
//回调函数
function test(){
console.log('test')
}
//调用匿名回调函数
func1(function(){
console.log('test2')
})
//调用箭头函数回调函数
func1(() => {
console.log('test3')
})
有参
//回调函数
function func1(value:Function){
//调用函数
//先做一些事情后,再调用回调函数
console.log(1 + 1)
value("nana");
}
func1(test)
//回调函数
function test(name:any){
console.log(name)
}
//调用匿名回调函数
func1(function(name:any){
console.log(name)
})
//调用箭头函数回调函数
func1((name:any) => {
console.log(name)
})
正则表达式
let reg = /\d{4}-\d{7}/g;
let str = "0345-1234567";
let res = reg.exec(str);
console.log(res); // ["0345-1234567"]
res.forEach(function(value,index){
console.log(value,index) //"0345-1234567", 0 匹配到的内容,以及匹配到的下标
})
访问修饰符
与java一样,不再讨论
设计模式
单例模式
饿汉式
//单例模式
//简单模拟_饿汉式
class SoundManager{
static Instance = new SoundManager();
private constructor(){
}
}
//用声音管理类
SoundManager.Instance
懒汉式
//单例模式
//简单模拟_懒汉式
class SoundManager{
private static instance:SoundManager;
private constructor(){
}
static Instance(){
//当前单例是否产生
//懒加载
if(!SoundManager.instance){
SoundManager.instance = new SoundManager();
}
return SoundManager.Instance;
}
}
//用声音管理类,不管调用几次,对应的都是同一个对象
SoundManager.Instance();
SoundManager.Instance();
SoundManager.Instance();
SoundManager.Instance();
代理模式
interface ICalc{
calc(num1:number,num2:number):number
}
//被委托人
class Npc1 implements ICalc{
calc(num1:number,num2:number){
return num1 + num2;
}
}
//被委托人
class Npc2 implements ICalc{
calc(num1:number,num2:number){
return num1 - num2;
}
}
//委托者
class Person{
//代理
delegate:ICalc
//
|undefined
GetNum(num1:number,num2:number){
//拿到num1和num2计算后的结果
let num = this.delegate.calc(num1,num2)
console.log(num + "")
}
}
//实例化委托人
let person = new Person()
//设定一个代理
person.delegate = new Npc1()
person.GetNum(3,4) //7
person.delegate = new Npc2()
person.GetNum(3,4) //-1
观察者模式
interface IObserver{
nameChanged(newName:any):any;
}
class Person{
//所有的观察者
observers:Array<IObserver> = new Array<IObserver>();
private _name:string|undefined
set name(value){
this._name = value
//发生变化
//遍历观察者数组,给所有的观察者发消息
for (let observe of this.observers){
observe.nameChanged(this._name);
}
}
get name(){
return this._name;
}
}
class Test implements IObserver{
nameChanged(newName: string){
console.log("监听到变化,名字变为" + newName)
}
}
let person = new Person();
let test = new Test();
//设置为监听对象
person.observers.push(test)
person.name = "哈哈哈"
工厂模式
enum EnemyType{
Boss,
Monster,
}
class Enemy{
name:string|undefined
//工厂方法,用来创建对象
static Create(enemyType:EnemyType):Enemy{
let enemy:Enemy
switch(enemyType){
case EnemyType.Boss:
enemy = new Boss();
break;
case EnemyType.Monster:
enemy = new Monster();
break;
}
return enemy;
}
}
class Boss extends Enemy{}
class Monster extends Enemy{}
let boss1 = Enemy.Create(EnemyType.Boss)
链表(目前不用特别关注,目前CPU性能够高,用不上)
链表从中间删除数据比较方便,直接把next直到下一个
链表遍历
class Person{
name:string|undefined;
next: Person;
constructor(name:string){
this.name = name;
}
}
let person = new Person("李逍遥")
person.next = new Person("王小虎")
person.next = new Person("赵灵儿")
//删除
person.next = person.next.next;
//添加
let tmpPerson = new Person("赵四")
tmpPerson.next = person.next;
person.next = tmpPerson;
while(person){
console.log(person.name)
//让节点后移
person = person.next
}