TypeScript02 方法特性【参数种类、参数个数】、generate方法、析构表达式、箭头表达式、循环
1 方法的参数
1.1 必选参数
调用方法时实参的个数必须和定义方法时形参在数量和类型上匹配
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x: number): number {
return x + 10;
} let y = test(210);
console.log(y); // let y02 = test(); // 报错:缺少参数信息
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x) {
return x + 10;
}
var y = test(210);
console.log(y);
// let y02 = test(); // 报错:缺少参数信息
JS代码
1.2 可选参数
调用方法时该参数可以不传入值
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x?: number): number {
if(x) {
return x + 100;
} else {
return 999;
}
} let y = test(); // 不传入参数
console.log(y); let y02 = test(100); // 传入参数
console.log((y02));
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x) {
if (x) {
return x + 100;
}
else {
return 999;
}
}
var y = test(); // 不传入参数
console.log(y);
var y02 = test(100); // 传入参数
console.log((y02));
JS代码
1.3 默认参数
调用方法时该参数可以传入,也可以不传入;不传入时就使用默认值
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x: number = 100): number {
return x + 100;
} let y = test(899); // 传入参数
console.log(y); let y02 = test(); // 不传入参数
console.log(y02);
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(x) {
if (x === void 0) { x = 100; }
return x + 100;
}
var y = test(899); // 传入参数
console.log(y);
var y02 = test(); // 不传入参数
console.log(y02);
JS代码
1.4 参数的顺序
必选参数 -> 可选参数 -> 默认参数
注意:可选参数必须在必选参数后面,默认参数没有要求,但是如果默认参数在必选参数前面,那么在不传入默认参数时就需要传入一个undefined去占位置
2 参数个数
2.1 任意多个单数01
调用方法时可以传入任意多个参数,而且参数的类型没有限定
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(...args) {
args.forEach(function (arg) {
console.log(arg);
});
} test(1,"warrior",2,"fury",[11,22,33],"fury",{name:"warrior", age: 24});
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
args.forEach(function (arg) {
console.log(arg);
});
}
test(1, "warrior", 2, "fury", [11, 22, 33], "fury", { name: "warrior", age: 24 });
JS代码
运行JS代码的结果为

2.2 任意多个单数02
将要传入的任意多个实参组合成一个数组,然后再传到方法中去
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test(...args) {
args.forEach(function (arg) {
console.log(arg);
});
} // test(1,"warrior",2,"fury",[11,22,33],"fury",{name:"warrior", age: 24}); var arg02 = [1,"warrior",2,"fury",[11,22,33],"fury",{name:"warrior", age: 24}];
test(...arg02);
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test() {
var args = [];
for (var _i = 0; _i < arguments.length; _i++) {
args[_i] = arguments[_i];
}
args.forEach(function (arg) {
console.log(arg);
});
}
// test(1,"warrior",2,"fury",[11,22,33],"fury",{name:"warrior", age: 24});
var arg02 = [1, "warrior", 2, "fury", [11, 22, 33], "fury", { name: "warrior", age: 24 }];
test.apply(void 0, arg02);
JS代码
运行JS代码的结果为

3 generate方法
调用不同,函数体遇到yield就会停下来
/**
* Created by Administrator on 2017/8/2 0002.
*/
function* test() {
console.log("start");
yield console.log("second"); // 相当于设置了一个断点,执行完yield后面的代码就会停下来
console.log("finish");
} let foo = test(); // 不能直接用 test() 去调用方法
foo.next(); // 执行完yield后面的代码就会停下来
// foo.next();
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
/**
* Created by Administrator on 2017/8/2 0002.
*/
function test() {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
console.log("start");
return [4 /*yield*/, console.log("second")];
case 1:
_a.sent(); // 相当于设置了一个断点,执行完yield后面的代码就会停下来
console.log("finish");
return [2 /*return*/];
}
});
}
var foo = test(); // 不能直接用 test() 去调用方法
foo.next(); // 执行完yield后面的代码就会停下来
// foo.next();
JS代码
运行JS代码的结果为

3.1 generate方法小案例
模拟股票价格变化,当达到预定值后就进行买入操作
/**
* Created by Administrator on 2017/8/2 0002.
*/
function* getStockPrice() {
while(true) {
yield Math.random()*100; // 产生随机数来模拟股票价格
}
} let priceGenerate = getStockPrice(); let currentPrice = 150; // 设定一个当前价格
let limitPrice = 20; // 设定一个买入价格 while(currentPrice > limitPrice) { // 到上一时刻的价格大于买入价格时就获取当前时刻的价格并打印当前时刻的价格
currentPrice = priceGenerate.next().value;
console.log(`当前股票的价格为:${currentPrice}`);
} console.log(`当前股票的价格已经低于${limitPrice},所以进行了自动买入操作。`); // 当股票价格低于买入价格时,就进行自动买入操作
var __generator = (this && this.__generator) || function (thisArg, body) {
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
function verb(n) { return function (v) { return step([n, v]); }; }
function step(op) {
if (f) throw new TypeError("Generator is already executing.");
while (_) try {
if (f = 1, y && (t = y[op[0] & 2 ? "return" : op[0] ? "throw" : "next"]) && !(t = t.call(y, op[1])).done) return t;
if (y = 0, t) op = [0, t.value];
switch (op[0]) {
case 0: case 1: t = op; break;
case 4: _.label++; return { value: op[1], done: false };
case 5: _.label++; y = op[1]; op = [0]; continue;
case 7: op = _.ops.pop(); _.trys.pop(); continue;
default:
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
if (t[2]) _.ops.pop();
_.trys.pop(); continue;
}
op = body.call(thisArg, _);
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
}
};
/**
* Created by Administrator on 2017/8/2 0002.
*/
function getStockPrice() {
return __generator(this, function (_a) {
switch (_a.label) {
case 0:
if (!true) return [3 /*break*/, 2];
return [4 /*yield*/, Math.random() * 100];
case 1:
_a.sent(); // 产生随机数来模拟股票价格
return [3 /*break*/, 0];
case 2: return [2 /*return*/];
}
});
}
var priceGenerate = getStockPrice();
var currentPrice = 150; // 设定一个当前价格
var limitPrice = 20; // 设定一个买入价格
while (currentPrice > limitPrice) {
currentPrice = priceGenerate.next().value;
console.log("\u5F53\u524D\u80A1\u7968\u7684\u4EF7\u683C\u4E3A\uFF1A" + currentPrice);
}
console.log("\u5F53\u524D\u80A1\u7968\u7684\u4EF7\u683C\u5DF2\u7ECF\u4F4E\u4E8E" + limitPrice + ",\u6240\u4EE5\u8FDB\u884C\u4E86\u81EA\u52A8\u4E70\u5165\u64CD\u4F5C\u3002"); // 当股票价格低于买入价格时,就进行自动买入操作
JS代码
运行JS代码的结果

4 析构表达式
通过表达式将对象或者数组拆解成任意属性的变量
4.1 对象析构表达式
注意:对象析构表达式的中变量的数量必须保持一致,而且变量名和对象的key值也要保持一致
let {nam, age ,address} = {nam:"warrior", age:24, address:"渝足"};
// let {nam, age ,address} = {nam:"warrior", age:24}; // 报错
// let {nam, age} = {nam:"warrior", age:24, address:"渝足"}; // 报错
console.log(nam)
console.log(age)
console.log(address)
var _a = { nam: "warrior", age: 24, address: "渝足" }, nam = _a.nam, age = _a.age, address = _a.address;
// let {nam, age ,address} = {nam:"warrior", age:24}; // 报错
// let {nam, age} = {nam:"warrior", age:24, address:"渝足"}; // 报错
console.log(nam);
console.log(age);
console.log(address);
JS代码
运行JS代码的结果

4.1.1 变量名和对象的key值不一致时的解决办法
let {nam: myName, age:myAge ,address:myAdress} = {nam:"warrior", age:24, address:"重庆"};
console.log(myName)
console.log(myAge)
console.log(myAdress)
var _a = { nam: "warrior", age: 24, address: "重庆" }, myName = _a.nam, myAge = _a.age, myAdress = _a.address;
console.log(myName);
console.log(myAge);
console.log(myAdress);
JS代码
运行JS代码的结果为

4.1.2 对象的一个key对应的value为一个对象的情况
let {
nam: myName,
age:myAge ,
address:myAdress,
habbit // :{habbit01,habbit02}
} = {
nam:"warrior",
age:24,
address:"重庆",
habbit: {
habbit01: "篮球",
habbit02: "足球"
}
};
console.log(myName)
console.log(myAge)
console.log(myAdress)
console.log(habbit)
var _a = {
nam: "warrior",
age: 24,
address: "重庆",
habbit: {
habbit01: "篮球",
habbit02: "足球"
}
}, myName = _a.nam, myAge = _a.age, myAdress = _a.address, habbit = _a.habbit // :{habbit01,habbit02}
;
console.log(myName);
console.log(myAge);
console.log(myAdress);
console.log(habbit);
JS代码
运行JS代码的结果为

4.1.3 将对象中某个key对应的对象中的数据拆解成变量
let {
nam: myName,
age:myAge ,
address:myAdress,
habbit :{habbit01,habbit02}, // 将对象中某个key对应的对象中的值拆解成变量
} = {
nam:"warrior",
age:24,
address:"重庆",
habbit: {
habbit01: "篮球",
habbit02: "足球"
}
};
console.log(myName)
console.log(myAge)
console.log(myAdress)
console.log(habbit01)
console.log(habbit02)
var _a = {
nam: "warrior",
age: 24,
address: "重庆",
habbit: {
habbit01: "篮球",
habbit02: "足球"
}
}, myName = _a.nam, myAge = _a.age, myAdress = _a.address, _b = _a.habbit, habbit01 = _b.habbit01, habbit02 = _b.habbit02;
console.log(myName);
console.log(myAge);
console.log(myAdress);
console.log(habbit01);
console.log(habbit02);
JS代码
运行JS代码的结果为

4.2 数组的析构表达式
4.2.1 变量个数和数组长度相等时
let arr = [1,2,3,4]; let [num1,num2,num3,num4] = arr; console.log(num1)
console.log(num2)
console.log(num3)
console.log(num4)
var arr = [1, 2, 3, 4];
var num1 = arr[0], num2 = arr[1], num3 = arr[2], num4 = arr[3];
console.log(num1);
console.log(num2);
console.log(num3);
console.log(num4);
JS代码
运行JS代码的结果为

4.2.2 变量个数小于数组长度时
利用逗号站位即可
let arr = [1,2,3,4]; let [,,num3,num4] = arr; // console.log(num1)
// console.log(num2)
console.log(num3)
console.log(num4)
var arr = [1, 2, 3, 4];
var num3 = arr[2], num4 = arr[3];
// console.log(num1)
// console.log(num2)
console.log(num3);
console.log(num4);
JS代码
运行JS代码的结果为

4.2.3 将数组的多个元素放到一个数组变量中
let arr = [1,2,3,4]; let [num1,num2,...args] = arr; console.log(num1)
console.log(num2)
console.log(args)
// console.log(num3)
// console.log(num4)
var arr = [1, 2, 3, 4];
var num1 = arr[0], num2 = arr[1], args = arr.slice(2);
console.log(num1);
console.log(num2);
console.log(args);
// console.log(num3)
// console.log(num4)
JS代码
运行JS代码的结果为

5 箭头表达式
用于声明匿名表达式
注意:参数只有一个是可以不用写括号,方法体只用一行时不用写大括号
注意:箭头表达式可以有效的避免this的指向问题【详情请参见“揭秘Angular2”】
let test = (x:number, y:number):number => {
x += 10;
y += 20;
return x + y;
};
console.log(test(12,3))
var test = function (x, y) {
x += 10;
y += 20;
return x + y;
};
console.log(test(12, 3));
JS代码
运行JS代码的结果

6 循环
6.1 forEach循环
会循环数组中的元素,但是会忽略掉数组中的属性;而且不能够跳出循环;循环替代者的类型是数组元素原来的类型
let arr01 = [1,2,3,4]
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持 arr01.forEach((value) => {console.log(value)})
var arr01 = [1, 2, 3, 4];
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持
arr01.forEach(function (value) { console.log(value); });
JS代码
运行JS代码的结果为

6.2 for...in...循环
可以循环元素和属性,循环到的元素都变成了string类型;这种循环可以被打断
let arr01 = [1,2,3,4]
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持 for(var value in arr01) {
if(value == "3") {
break;
}
console.log(value);
}
var arr01 = [1, 2, 3, 4];
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持
for (var value in arr01) {
// if (value == "3") { // 虽然数组中的元素都是number类型,但是循环替代者value是字符串类型
// break;
// }
console.log(value);
}
JS代码
运行JS代码的结果为

6.3 for...of...循环
会循环数组元素和数组属性,还可以被打断;循环替代者的类型是数组元素的类型
let arr01 = [1,2,3,4]
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持 for(var value of arr01) {
if(value == 3) {
console.log("Hello Boy");
break;
}
console.log(value);
}
var arr01 = [1, 2, 3, 4];
arr01.desc = "我是arr01数组的描述属性哟。"; // ts不支持,但是js支持
for (var _i = 0, arr01_1 = arr01; _i < arr01_1.length; _i++) {
var value = arr01_1[_i];
if (value == 3) {
console.log("Hello Boy");
break;
}
console.log(value);
}
JS代码
运行JS代码的结果为

7、类、接口、泛型、注解、类型定义文件
待更新...2017年8月2日17:58:51
可以参见手册或相关书籍
TypeScript02 方法特性【参数种类、参数个数】、generate方法、析构表达式、箭头表达式、循环的更多相关文章
- JDK5新特性之 可变参数的方法
可变参数的方法:不知道这个方法该定义多少个参数 注意: > 参数实际上是数组 > 必须写在参数列表最后一个 package cn.itcast.day24.varparam; import ...
- Shell脚本中判断输入参数个数的方法投稿:junjie 字体:[增加 减小] 类型:转载
Shell脚本中判断输入参数个数的方法 投稿:junjie 字体:[增加 减小] 类型:转载 这篇文章主要介绍了Shell脚本中判断输入参数个数的方法,使用内置变量$#即可实现判断输入了多少个参数 ...
- C#3.0新特性:隐式类型、扩展方法、自动实现属性,对象/集合初始值设定、匿名类型、Lambda,Linq,表达式树、可选参数与命名参数
一.隐式类型var 从 Visual C# 3.0 开始,在方法范围中声明的变量可以具有隐式类型var.隐式类型可以替代任何类型,编译器自动推断类型. 1.var类型的局部变量必须赋予初始值,包括匿名 ...
- JDK5新特性:可变参数方法
JDK1.5增加可变参方法,其定义格式为: 访问修饰符 返回值类型 方法标识符(参数类型 参数标识符1,参数类型 参数标识符2,参数类型...参数标识符){} 如可能要定义一个求和功能的方法,但求和的 ...
- JAVA 1.5 局部特性(可变参数/ANNOTATION/并发操作)
1: 可变参数 可变参数意味着可以对某类型参数进行概括,例如十个INT可以总结为一个INT数组,当然在固定长度情况下用数组是很正常的 这也意味着重点是可变,不定长度的参数 PS1:对于继承和重写我没有 ...
- C++反射机制:可变参数模板实现C++反射(使用C++11的新特性--可变模版参数,只根据类的名字(字符串)创建类的实例。在Nebula高性能网络框架中大量应用)
1. 概要 本文描述一个通过C++可变参数模板实现C++反射机制的方法.该方法非常实用,在Nebula高性能网络框架中大量应用,实现了非常强大的动态加载动态创建功能.Nebula框架在码云的仓库地 ...
- C#方法的六种参数,值参数、引用参数、输出参数、参数数组、命名参数、可选参数
方法的参数有六种,分别是值参数.引用参数.输出参数.参数数组.命名参数.可选参数. 值参数 值参数是方法的默认类型,通过复制实参的值到形参的方式把数据传递到方法,方法被调用时,系统作两步操作: 在栈中 ...
- PHP函数可变参数列表的具体实现方法介绍
PHP函数可变参数列表可以通过_get_args().func_num_args().func_get_arg()这三个函数来实现.我们下面就对此做了详细的介绍. AD:2014WOT全球软件技术峰会 ...
- 使用getParameterMap()方法实现对请求参数的封装的工具类
我们知道,HttpServletRequest这个类的getParameter(name),getParameterValues(name)可以分别实现对页面传来的单个参数和对多个同名参数的接受.特别 ...
随机推荐
- Vue2 全家桶仿 微信App 项目,支持多人在线聊天和机器人聊天
前言 这个项目是利用工作之余写的一个模仿微信app的单页面应用,整个项目包含27个页面,涉及实时群聊,机器人聊天,同学录,朋友圈等等,后续页面还是开发中.写这个项目主要目的是练习和熟悉vue和vuex ...
- 浅谈Swift和OC的区别
前言 转眼Swift3都出来快一年了,从OC到Swift也经历了很多,所以对两者的一些使用区别也总结了一点,暂且记录下,权当自己的一个笔记. 当然其中一些区别可能大家都有耳闻,所以这里也会结合自身的一 ...
- webpack vue 配置
vue-loader 1.)首先创建项目目录 --vue-loader文件夹 |-index.html 入口文件 |-main.js 入口文件 |-App.vue Vue文件 |-package.js ...
- XCOM2中敌对生物设计分析(Aliens篇)
Aliens Aliens作为游戏设定中入侵的外星人,有各式外貌及奇特的战斗方式,掌握一些高能科技或利用精神力量进行攻击 Sectoid 使用灵能战斗的外星人,并无高级版本,初级便会使用精神控制,生命 ...
- memcache基础
一.Memcache是一种缓存技术(内存),你可以把它想像成一张巨大的内存表,形式如下[它就是一个服务] key value key值(字符串) 可以放(字符串[二进制数据[视频.音频.图片]],数值 ...
- linux统计cdn日志慢请求
./stat_ip.sh live-https.log-0510.gz 1000 #首先用shell脚本可以统计出?日志慢请求查询时间超过?秒对应的ip和对应的调用次数(传两个参数) #!/bin/b ...
- 【项目1-1】使用HTML5+CSS3绘制HTML5的logo
作为一个WEB小萌新,自学了有一段时间,总是感觉停滞不前.最近反思中,想到前贤一句话:书读百遍其义自见.说到底,还是项目做的少,如果做多了,想必自然会得心应手. 利用HTML5+CSS3绘制HTML5 ...
- SpringMvc多视图配置(jsp、velocity、freemarker) velocity在springmvc.xml配置VelocityViewResolver,VelocityConfigurer,FreeMarkerConfigurer,FreeMarkerViewResolver
?xml version="1.0"encoding="UTF-8"?> <beans xmlns="http://www.springf ...
- ubuntu12.0.4安装启动后无法进入图形操作界面
在VMware10.0.4虚拟机上安装ubuntu12.0.4版本后,启动linux后,无法进入图形界面,但是可以进入字符界面.通过查阅网上资料,有人说是VMware的3D图形加速没有关闭,于是通过查 ...
- Django学习(二)---使用模板Templates
学会使用渲染模板的方法来显示html内容. 一.Templates是什么: HTML文件 使用了Django模板语言(Django Tamplate Language DTL) 可以使用第三方模板 二 ...