一、类型基础

# 一、类型基础
# 强类型与弱类型
# 静态类型语言与动态类型语言
静态类型语言:在编译阶段确定所有变量的类型 动态类型语言:在执行阶段确定所有变量的类型
# JS与C++对比
JS
class C {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
function add(a, b) {
return a.x + a.y + b.x + b.y;
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
C++
class C {
public:
int x;
int y;
}
int add(C a, C b) {
return a.x + a.y + b.x + b.y;
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
JS
- 在程序运行时,动态计算属性偏移量
- 需要额外的空间存储属性名
- 所有对象的便宜了信息各存一份
C++
- 编译阶段确定属性偏移量
- 用偏移量访问代替属性访问
- 偏移量信息共享
| 静态类型语言 | 动态类型语言 |
|---|---|
| 对类型极度严格 | 对类型非常宽松 |
| 立即发现错误 | Bug可能隐藏数月甚至数年 |
| 运行时性能好 | 运行时性能差 |
| 自文档化 | 可读性差 |
动态类型语言的支持者认为:
- 性能是可以改善的(V8引擎),而语言的灵活性更重要
- 隐藏的错误可以通过单元测试发现
- 文档可以通过工具生成
JS是动态弱类型语言
# 其他定义
美国加州大学的讲义中定义 强类型语言:不允许程序在发生错误后继续执行 这样定义,C/C++就是弱类型语言,因为他们没有对数组越界进行检查,由此可能导致程序的崩溃
争议:C/C++是强类型还是弱类型?
# 总结

上次更新: 2021/04/22, 00:08:06