这是我参与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引擎),而语言的灵活性更重要
- 隐藏的错误可以通过单元测试发现
- 文档可以通过工具生成