## 4\. 函数
### 4.1 函数的定义
~~~
function hello(name:string):void {
console.log('hello',name);
}
hello('zfpx');
~~~
### 4.2 函数表达式
* 定义函数类型
~~~
type GetUsernameFunction = (x:string,y:string)=>string;
let getUsername:GetUsernameFunction = function(firstName,lastName){
return firstName + lastName;
}
~~~
### 4.3 没有返回值
~~~
let hello2 = function (name:string):void {
console.log('hello2',name);
}
hello('zfpx');
hello2('zfpx');
~~~
### 4.4 可选参数
在TS中函数的形参和实参必须一样,不一样就要配置可选参数,而且必须是最后一个参数
~~~
function print(name:string,age?:number):void {
console.log(name,age);
}
print('zfpx');
~~~
### 4.5 默认参数
~~~
function ajax(url:string,method:string='GET') {
console.log(url,method);
}
ajax('/users');
~~~
### 4.6 剩余参数
~~~
function sum(...numbers:number[]) {
return numbers.reduce((val,item)=>val+=item,0);
}
console.log(sum(1,2,3));
~~~
### 4.7 函数重载
* 在Java中的重载,指的是两个或者两个以上的同名函数,参数不一样
* 在TypeScript中,表现为给同一个函数提供多个函数类型定义
~~~
let obj: any={};
function attr(val: string): void;
function attr(val: number): void;
function attr(val:any):void {
if (typeof val === 'number') {
obj.age=val;
} else {
obj.name=val;
}
}
attr('zfpx');
attr(9);
attr(true);
console.log(obj);
~~~
~~~
//如何定义类
//Property 'name' has no initializer and is not definitely assigned
//in the constructor.ts(2564)
namespace a {
class Person {
name: string = 'zhufeng';
age: number;
constructor() {
this.age = 10;
}
}
let p1 = new Person();
console.log(p1.name);
console.log(p1.age);
}
namespace b {
// 存取器 getter setter
class Person {
myname: string;
constructor(name: string) {
this.myname = name;
}
get name() {
return this.myname;
}
set name(newVal: string) {
this.myname = newVal.toUpperCase();
}
}
let p = new Person('zhufeng');
console.log(p.name);//zhufeng
p.name = 'jiagou';
console.log(p.name);
}
namespace c {
class Person {
constructor(public name: string) {
}
}
let p = new Person('zhufeng');
p.name = 'jiagou';
}
//继承
/**
* 子类继承父类后子类的实例上就拥有了父类中的属性和方法
* 访问修饰符 public protected private
* public 自己 自己的子类 和其它类都可能访问
* protected 受保护的 自己和自己的子类能访问 ,其它 类不能访问
* private 私有的 只能自己访问,自己的子类不能访问,其它更不行了
*/
namespace d {
class Person {
public name: string;
protected age: number;
private amount: number;
constructor(name: string, age: number) {
this.name = name;
this.age = age;
this.amount = 100;
}
getName() {
return this.name;
}
setName(newName: string) {
this.name = newName;
}
}
class Student extends Person {
static type = 'Student'
stuNo: number;
constructor(name: string, age: number, stuNo: number) {
super(name, age);
this.stuNo = stuNo;
}
static getType() {
return Student.type;
}
getStuNo() {
return this.name + this.age + this.amount + this.stuNo;
}
setStuNo(newStuNo: number) {
this.stuNo = newStuNo;
}
}
let s = new Student('zhufeng', 10, 1);
console.log(s.name);
console.log(s.age);
console.log(s.amount);
console.log(Student.type);
Student.getType();
}
~~~
### 5.5 继承
* 子类继承父类后子类的实例就拥有了父类中的属性和方法,可以增强代码的可复用性
* 将子类公用的方法抽象出来放在父类中,自己的特殊逻辑放在子类中重写父类的逻辑
* super可以调用父类上的方法和属性
~~~
class Person {
name: string;//定义实例的属性,默认省略public修饰符
age: number;
constructor(name:string,age:number) {//构造函数
this.name=name;
this.age=age;
}
getName():string {
return this.name;
}
setName(name:string): void{
this.name=name;
}
}
class Student extends Person{
no: number;
constructor(name:string,age:number,no:number) {
super(name,age);
this.no=no;
}
getNo():number {
return this.no;
}
}
let s1=new Student('zfpx',10,1);
console.log(s1);
~~~
- 文档简介
- 基础面试题【珠峰2019.8】
- P01_call,aplly区别
- P02_综合面试题讲解2-2
- P03_箭头函数和普通函数区别-综合面试题讲解2-3
- P05_实现indexOf
- P06_综合面试题讲解2-6
- P07_URL解析题
- P08_原型题
- P09_图片延时加载
- P10_正则-包含数字字母下划线
- P11_综合面试题讲解2-11
- P12_英文字母加空格
- P13_数组扁平化并去重
- P14_模拟实现new
- P15_合并数组
- P16_定时器,打印012345
- P17_匿名函数输出值问题
- P18_a在什么情况下打印输出+1+1+1
- P19_对数组的理解
- P20_冒泡排序
- P21_插入排序
- P22_快速排序
- P23_销售额存在对象中
- P24_求数组的交集
- P25_旋转数组
- P26_ [函数柯理化思想]
- P27_ [柯理化函数的递归]
- 网络协议【珠峰2019.6】
- TypeScript+Axios入门+实战【珠峰2019.11】
- 1.数据结构
- 2.函数和继承
- 3.装饰器
- 4.抽象类-接口-泛型
- 05-结构类型系统和类型保护
- 06-类型变换
- AST-抽象语法树
- React性能优化【珠峰2019.10】
- 1-react性能优化
- 2-react性能优化
- 3.react-immutable
- React Hooks【珠峰2019.12】
- 前端框架及项目面试
- 第07章 React 使用
- 7-1 React使用-考点串讲
- 7-2 JSX基本知识点串讲
- 7-3 JSX如何判断条件和渲染列表
- 7-4 React事件为何bind this
- 7-5 React事件和DOM事件的区别
- 7-6 React表单知识点串讲
- 7-7 React父子组件通讯
- 7-8 setState为何使用不可变值
- 7-9 setState是同步还是异步
- 7-10 setState合适会合并state
- 7-11 React组件生命周期
- 7-12 React基本使用-知识点总结和复习
- 7-13 React函数组件和class组件有何区别
- 7-14 什么是React非受控组件
- 7-15 什么场景需要用React Portals
- 7-16 是否用过React Context
- 7-17 React如何异步加载组件
- 7-18 React性能优化-SCU的核心问题在哪里
- 7-19 React性能优化-SCU默认返回什么
- 7-20 React性能优化-SCU一定要配合不可变值
- 7-21 React性能优化-PureComponent和memo
- 7-22 React性能优化-了解immutable.js
- 7-23 什么是React高阶组件
- 7-24 什么是React Render Props
- 7-25 React高级特性考点总结
- 7-26 Redux考点串讲
- 7-27 描述Redux单项数据流
- 7-28 串讲react-redux知识点
- 7-29 Redux action如何处理异步
- 7-30 简述Redux中间件原理
- 7-31 串讲react-router知识点
- 7-32 React使用-考点总结
- 第08章 React 原理
- 8-1 React原理-考点串讲
- 8-2 再次回顾不可变值
- 8-3 vdom和diff是实现React的核心技术
- 8-4 JSX本质是什么
- 8-5 说一下React的合成事件机制
- 8-6 说一下React的batchUpdate机制
- 8-7 简述React事务机制
- 8-8 说一下React组件渲染和更新的过程
- 8-9 React-fiber如何优化性能
- 第09章 React 面试真题演练
- 9-1 React真题演练-1-组件之间如何通讯
- 9-2 React真题演练-2-ajax应该放在哪个生命周期
- 9-3 React真题演练-3-组件公共逻辑如何抽离
- 9-4 React真题演练-4-React常见性能优化方式
- 9-5 React真题演练-5-React和Vue的区别
- 第10章 webpack 和 babel
- 10-1 webpack考点梳理
- 10-2 webpack基本配置串讲(上)
- 10-3 webpack基本配置串讲(下)
- 10-4 webpack如何配置多入口
- 10-5 webpack如何抽离压缩css文件
- 10-6 webpack如何抽离公共代码和第三方代码
- 10-7 webpack如何实现异步加载JS
- 10-8 module chunk bundle 的区别
- 10-9 webpack优化构建速度-知识点串讲
- 10-11 happyPack是什么
- 10-12 webpack如何配置热更新
- 10-13 何时使用DllPlugin
- 10-14 webpack优化构建速度-考点总结和复习
- 10-15 webpack优化产出代码-考点串讲
- 10-16 什么是Tree-Shaking
- 10-17 ES Module 和 Commonjs 的区别
- 10-18 什么是Scope Hostin
- 10-19 babel基本概念串讲
- 10-20 babel-polyfill是什么
- 10-21 babel-polyfill如何按需引入
- 10-22 babel-runtime是什么
- 10-23 webpack考点总结和复习
- 10-24 webpack面试真题-前端代码为何要打包
- 10-25 webpack面试真题-为何Proxy不能被Polyfill
- 10-26 webpack面试真题-常见性能优化方法