学习TypeScript第一步认识类型基础

187 阅读2分钟

这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

类型基础

在强类型语言中,当一个对象从调用函数传递到被调用函数时,其类型必须与被调用函数中声明的类型兼容 —Liskov, Zilles 1974

  • 强类型语言:不允许改变变量的数据类型,除非进行强制类型转换
class C {
  public static void main(String[] args){
    int x = 1;
    boolean y = true;
     x = y;
     System.out.println(x);
  }
}

运行结果:

class C {
  public static void main(String[] args){
    int x = 1;
    boolean y = true;
    //      x = y;
    char z= 'a';
    x=z;
    System.out.println(x);
  }
}

打印结果

这里是因为Java强制把a的ASCII码赋值给了x

  • 弱类型语言:变量可以被赋予不同的数据类型
let x = 1;
let y = true;
x = y;

结果:

true
let x = 1;
let z = 'a';
x = z;

结果:

'a'
  • 静态类型语言:在编译阶段确定所有变量的类型
  • 动态类型语言:在执行阶段确定所有变量的类型

JavaScript

class c {
  constructor(x,y){
    this.x = X;
    this.y = y;
  }
}
function add(a, b){
  return a.x + a.y + b.x + b.y;
}

c++

class c{
  public:
    int x;
    int y;
 }
int add(c a, cb){
  return a.x +a.y + b.x + b.y;
}

JavaScript

  • 在程序运行时,动态计算属性偏移量
  • 需要额外的空间存储属性名
  • 所有对象的偏移量信息各存一份 c++
  • 编译阶段确定属性偏移量用偏移量
  • 访问代替属性名访问
  • 偏移量信息共享
静态类型语言动态类型语言
对类型极度严格自文档化
立即发现错误Bug可能隐藏数月甚至数年
立即发现错误运行时性能差
自文档化运行时性能差

动态类型语言的支持者认为:

  • 性能是可以改善的(V8引擎),而语言的灵活性更重要
  • 隐藏的错误可以通过单元测试发现
  • 文档可以通过工具生成