TypeScript基础知识

字符串新特性

多行字符串

  这里需要用到反引号,即Tab键上的 ~ 键,所谓多行字符串就是字符串可以换行输出。

var str = `aaa
bbb
ccc`;

字符串模板

  其实都是ES6的语法,${element} 替代以前的 + 连接字符串。

var myname = "Bert";
var getName = function(){
    return "Zuo";
}
console.log(`Hello ${myname}`);
console.log(`Hello ${getName()}`);
console.log(`<div>
<span>${myname}</span>
<p>${getName}</p>
<div>notice format</div>
</div>`)

自动拆分字符串

function test(template,name,age){
    console.log(template);
    console.log(name);
    console.log(age);
}
var myname = "Bert";
var getAge = function(){
    return 18;
}
test `Hello,my name is ${myname},I'm ${getAge()}.`;

  test 后直接跟反引号,其中字符串模板以 ${} 为分割,获得三部分内容存放在数组中也就是 template。

参数新特性

参数类型

  在参数的后面使用冒号来指定参数的类型。

var myname: string = "Bert";

  以上代码声明一个字符串类型的变量,在之后想要修改该变量,如果类型不是string就会报错,这大大帮助减少错误的发生。其实在typescript中,首次给变量赋的值类型会当其默认,之后改变类型的赋值都会报错。可以定义的类型有:
(1)any 任何类型

var name: any = "Hello";

(2)number 数值

var age: number = 18;

(3)boolean 布尔类型

var man: boolean = true;

(4)void 方法中无返回值

function test(): void{
    // 无返回值
}

  综上,写一个小例子:

function test(name: string): string{
    return "";
}
test("Bert");

  以上代码的意思是,这个 test 方法的返回值定义成 string 类型,输出其他类型会报错;方法中参数定义成 string 类型,调用方法是给的参数如果不是 string 类型会报错。
另外,有一种自定义类型的方法,可以帮助语法提示,提高效率。譬如:

// 声明自定义类型
class Person{
    name: String;
    age: number;
}
var Tony: Person = new Person();
// 自动语法提示
Tony.name = "托尼";
Tony.age = 18;

参数默认值

  在参数声明后面用等号来指定参数的默认值。在调用带参的函数方法时,传递的参数数量不足定义的参数数量,就会报错,设置默认值即可以不用传递全部参数。

function test(name: string, age: number, man: boolean=true){
    console.log(name);
    console.log(age);
    console.log(man);
}
test("Bert",18);

  这儿有一个需要注意的地方。设置的默认参数,必须在所有参数的最后,这是因为如果第一个参数默认化,在调用时所传递参数是按顺序执行,第一个参数重新定义了默认的参数,那么最后会少一个参数的值。当然,可以全部定义默认值,这就没什么顺序问题了。

可选参数

  在方法的参数声明之后用问号来标明此参数为可选参数。可选参数如果不传递值的话,不会报错之后显示undefined。

function test(name: string, age?: number, man: boolean=true){
    console.log(name);
    console.log(age);
    console.log(man);
}
test("Bert");

函数新特性

Rest and Spread 操作符

  这个操作符就是 … 它用来声明任意数量的方法参数。这儿有两个用法。
(1)传递任意数量的参数

function fun1(...args){
    args.forEach(function(arg){
        console.log(arg);
    })
}
fun1([1, 2, 3, 4, 5]);

(2)返回参数的用法

function fun2(a,b,c){
    console.log(a);
    console.log(b);
    console.log(c);
}
var args1 = [1,2];
fun2(...args1);         //1,2,undefined

var args2 = [5,6,7,8,9];
fun2(...args2);         //5,6,7

  fun2中定义的参数有三个,args1传递的参数只有两个,少的会显示undefined,而如果传递参数多了,那多余的参数值不显示。

generator 函数

  控制函数的执行过程, 手工暂停和恢复代码执行。(不太懂,似乎这样function* 就是generator)

function* getStockPrice(stock){
    while(true){
        yield Math.random()*100;
    }
}
var priceGenerator = getStockPrice("IBM");
var limitPrice = 15;
var price = 100;
while(price > limitPrice){
    price = priceGenerator.next().value;
    console.log(`The generator return ${price}`);
}
console.log(`buying ar ${price}`);

destructuring析构表达式

  通过表达式将对象或数组拆解成任意数量的变量。这儿有两个用法。
(1)析构表达式从对象中取值

function getInfo() { 
    return {
        name: {
            firstName: "Bert",
            lastName:"Zuo"
        },
        age: 18
    }
}

var { name: { lastName }, age:AGE } = getInfo();
console.log(lastName);
console.log(AGE);

  析构表达式中的变量名需要和函数方法中定义的相同,其实这一过程就是从函数方法中找到该变量。可以原变量值返回,也可以重命名一下,age:AGE就是返回age的值,只是多了一步以AGE名称输出。name对象里嵌套着对象,那析构表达式也是可以嵌套的。
(2)析构表达式从数组中取值

var arr1 = [1, 2, 3, 4];
var [, , number1, number2] = arr1;
console.log(number1);   //3
console.log(number2);   //4

var arr2 = [1, 2, 3, 4];
var [number1, number2, ...other] = arr2;
console.log(number1);   //1
console.log(number2);   //2
console.log(other);     //[3,4]

var arr3 = [1, 2, 3, 4];
function doSomething([number1, number2, ...other]) { 
    console.log(number1);
    console.log(number2);
    console.log(other);
}
doSomething(arr3);	//1,2,[3,4]

箭头表达式

箭头表达式写法

// 占一行的写法
var sum1 = (arg1, arg2) => arg1 + arg2;

// 多行的写法
var sum2 = (arg1, arg2)=>{ 
    return arg1 + arg2;
}

// 一个参数的写法
var argNmae = arg => { 
    console.log(arg);
}

// 无参数无返回的写法
var ele = () => { 
    
}

常见的应用

var arr = [1, 2, 3, 4, 5];
// filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
console.log(arr.filter(value => value % 2 == 0));

箭头函数的优势

  箭头函数的好处不仅仅在于简化了代码(把function()转化为()=>),它最大的好处是解决了this指向问题。可以先看一下ES5中匿名函数导致的this指向问题:

function getName1(name) { 
    this.name = name;

    setInterval(function () { 
        console.log("The name is " + this.name);
    },1000)
}
var name1 = new getName1("Bert");
看一下结果,都没有值的显示,明明想要的是The name is Bert.

在这里插入图片描述
  改成箭头函数的写法:

function getName2(name: string) { 
    this.name = name;

    setInterval(() => { 
        console.log("The name is " + this.name);
    },1000)
}
var age1 = new getName2("Bert");

在这里插入图片描述

循环语法新特性

  也是ES6的语法,新增了for of 循环,但这之前先看一下以前的 forEach, for in 这两个循环。

forEach

  forEach循环不遍历属性,而且break无效。

var arr = [1, 2, 3, 4, 5];
// 自定义一个数组属性
arr.desc = "five number";

arr.forEach(value => console.log(value));

for in

  for in 循环中的 n 代表的是数组集合中的key值(即数组下标),它遍历属性。

var arr = [1, 2, 3, 4, 5];
// 自定义一个数组属性
arr.desc = "five number";
for (var n in arr) { 
    console.log(arr[n]);
}

for of

  for of 循环 中的 i 直接就是value值,允许breakbreak,但是不读取属性值。

var arr = [1, 2, 3, 4, 5];
// 自定义一个数组属性
arr.desc = "five number";
for (var i of arr) { 
    if (i > 3) { 
        break;
    }
    console.log(i);
}

猜你喜欢

转载自blog.csdn.net/bertZuo/article/details/86576523