全栈学习:JsTs合集
目录
本文讲解的是JavaScript和TypeScript在使用中容易犯错的点,以及一些特别重要的其他要点。
概述
- Javascript是一种轻量级的,解释型编程语言。虽然是以为浏览器页面服务而开发的脚本语言。但也可以用于一些非浏览器的环境。
- 标准名为ECMAScript,即ES,目前支持较广的高版本为ES6。
- Typescript是Javascript的超集。由于Js有一些设计上的问题(或者说特性),在面向大规模工程时,并不是特别好的选择。因此Ts应运而生。
闭包
- 闭包中的this:
- 使用function进行的闭包定义,其中的this,会在运行时动态解析,导致和编程的含义不同(除非你确实希望是动态时的this)。
- 使用箭头函数进行闭包定义,其中的this,会绑定为定义时所在位置的this。在执行时也不会变。推荐
- 使用bind等方式,可以在运行时手动绑定this。
自带属性
- name:类型名称
class A{} console.log(A.name);
兼容性问题
- 概述:兼容性问题目前主要体现在es5和es6上,虽然es6的特性非常好,但是并不能保证所有的浏览器都支持了es6,事实上很多浏览器可能支持的标准更低、更不完善。
- babel
Interface
- interface是ts中非常灵活的一个种类,提供了非常强大的泛型能力,可以用来限定实现者必须具备的静态、普通成员变量、函数
- 限定必须具备的常规成员、静态成员(但是静态成员只属于类型,不属于实例,这一点注意和其他语言区分)
interface NormalMember { props3:string; } interface StaticMember { prop1:string; build():string; // 而这里又要求构造产生一个NormalMember类型 // 相当于限制了常规的非静态成员 new():NormalMember } class Type { static prop1:string="Type"; static build(): string { return ""; } prop3:string; constructor() { this.prop3="h"; } } buildType(type:StaticMember){ // 在这一行,会检查,type必须具备StaticMember里要求的成员 // 因为是属于类的成员,所以只能是静态成员(构造函数也是) return new type(); }
类类型
- C++中有模板元编程可以对类类型进行运算,Java则更是提供了完整的关于类类型的表示、处理、反射等内容,Typescript中也有类似功能,但是其实现相对更trick
- 基本原理:利用interface、extends、Function共同完成
// 同时限定,返回值类型是T,而且是一个具有new构造函数能力的东西,也就是一种类型
export interface Type<T = any> extends Function {
new (...args: any[]): T;
}
// 搭配InstanceOf使用,用于获取构造函数类型所构造出的实例类型
function f(t:Type){
const a: InstanceType<Type> = new t();
}
TypeScript中所谓的类,其实就是一种构造函数,因此所谓类类型,也可以叫做构造函数类型
坑
- NaN:数值是否有效,只能用isNaN函数进行判断
- null和undefined,==和===:
- 空变量===undefined成立,而且空变量!==null成立,但空变量==null也成立
- null==undefined成立,但null!==undefined成立
- 总之:==和===的主要区别是==会尝试进行类型转换,转换后相等即可,===要求类型内容完全一致
推荐工具
一个有依赖库的在线运行环境:JavaScript PlayGround