• TypeScript和JavaScript的一些小技巧记录


    项目里使用到的技巧,记录一下,会持续更新。

    JS的技巧完全可以使用到TS上哦。

    JS

    向下取整

    Math.floor(4.5); // 4

    简写:

    var num = 4.5;
    ~~num;
    num << 0;
    num >> 0;
    num >>> 0;

    四种写法都会返回向下取整后的值,即4。

    但是要注意,简写的方式用在负数上会得到错误的结果:

    Math.floor(-4.1); // -5
    ~~-4.1; // -4
    -4.1 << 0; // -4
    -4.1 >> 0; // -4
    -4.1 >>> 0; // 4294967292

    或者说在负数上变成了向上取整,另外由于 >>> 是无符号的位移操作,所以会得到一个巨大的正数。另外一点:没有 <<< 这个操作符哦。

    字符串转数字

    parseInt("4.5"); // 4
    parseFloat("4.5"); // 4.5
    parseInt({a:1}); // NaN

    简写:

    var num = "4.5";
    +num; // 4.5
    
    num = {a:1};
    +num; // NaN

    转Boolean值

    Boolean(5.99); // true
    Boolean(0); // false
    Boolean(1); // true
    Boolean(null); // false
    Boolean(undefined); // false
    Boolean(""); // false
    Boolean("1"); // true
    Boolean({}); // true

    简写:

    !!5.99; // true
    !!0; // false
    !!1; // true
    !!null; // false
    !!undefined; // false
    !!""; // false
    !!"1"; // true
    !!{}; // true

    void 0

    如果编写的代码会直接发布,尽可能用 void 0 代替 null 和 undefined,因为在某些浏览器中,undefined可以被赋值导致判断全部错误。

    比如在TS中,编译后,使用到的undefined都会替换为 void 0。

    TS

    多使用接口方式

    比如传递参数时,这么写:

    func(a: Point);

    只能接受Point类型的变量,如果用下面的写法:

    func(a: {x:number, y:number});

    就可以接受带有x和y的所有变量,可以更好的复用该函数。

    快速得到属性

    一般的写法:

    let x = point.x;
    let y = point.y;

    简写:

    let {x, y} = point;

    一般的写法:

    let arr = "100;200;300".split(';');
    let a = arr[0];
    let b = arr[1];
    let c = arr[2];

    简写:

    let [a, b, c] = "100;200;300".split(';');

    快速写入属性

    一般的写法:

    let a = 0;
    let b = "heelo";
    let obj = {a: a, b: b};

    简写:

    let a = 0;
    let b = "heelo";
    let obj = {a, b};

    参数类类型控制

    比如我们需要传递一个参数,该参数是MyClass类的类型,而不是实例时,一般只能用any,实际上是可以指定类型的,写法如下:

    public func(classType: { new(): MyClass }): void;

    传入类型,得到该类型的实例

    一般用于工厂或对象池等:

    export function getInstance<T>(Class: {new () : T}): T {
      return new Class();
    }

    单例的简写方式

    static get instance(): Obj {
      return this._instance || (this._instance = new Obj());
    }

    类属性控制

    interface IObj {
      // 可选属性
      name?: string;
      // 只读属性
      readonly age: number;
    }

    控制动态属性:

    interface Map<T> {
      [key: string]: T;
    }

    用接口来规范一个对象

    比如我们有一个接口,可以用下面的方法来规范一个对象,而不用编写一个实现该接口的类:

     1 export interface IPoint {
     2   x: number;
     3   y: number;
     4 }
     5 
     6 export function foo(point: IPoint) {
     7   // ...
     8 }
     9 
    10 foo(<IPoint> {x: 100, y: 100});

    如果打错属性名称或缺少必须的属性会报错,属性类型不匹配也会报错,可以大大降低写错的问题。另外添加额外属性是允许的。

  • 相关阅读:
    Atitit 图像处理类库 halcon11  安装与环境搭建attilax总结
    Atitit  undac网络设备管理法案 (路由器 交换机等)    法案编号USRr101510
    Atitit 图像处理 halcon类库的使用  范例边缘检测 attilax总结
    Atitit Seed-Filling种子填充算法attilax总结
    Atitti 图像处理 特征提取的科技树 attilax总结
    Atitit 软件体系的进化,是否需要一个处理中心
    Atitit 项目的主体设计与结构文档 v5
    Atitti 过程导向 vs 结果导向 attilax的策略
    Atitti 过程导向 vs 结果导向 attlax的策
    Atitit 版本管理----分支管理
  • 原文地址:https://www.cnblogs.com/hammerc/p/7428404.html
Copyright © 2020-2023  润新知