Typescript学习之路(2) - 类型简述
什么是强类型语言/弱类型语言?
强类型语言
老式定义:在强类型语言中,当一个对象从调用函数传递到被调用函数时,其类型必须与被调用函数中声明的类型兼容。
A(){
B (x)
}
B(y) {
// y可以被赋值x, 程序运行良好
}
新式定义: 不允许改变变量的数据类型,除非进行强制类型转换。
弱类型语言
变量可以赋值为任意类型,如JavaScript。
// Javascript
let x = 1;
let y = true;
x = y; // 不同类型赋值成功,且不会报错。
let z = 'a';
x = z; // 不同类型赋值成功,且不会报错。
什么是静态类型语言/动态类型语言?
静态类型语言
在编译阶段确定所有变量的类型。
动态类型语言
在执行阶段确定所有变量的类型。
下面是实现一段 加法 功能的代码:
// Javascript - 在编译代码时编译器无法获取变量a、b的类型,只能在运行时才能知道
class C {
constructor(x, y) {
this.x = x;
this.y = y;
}
}
function add (a, b) {
return a.x + a.y + b.x + b.y
}
// Java - 在编译时就知道变量的类型,a,b均为整型
class C {
public:
int x;
int y;
}
int add (C a, C b) {
return a.x + a.y + b.x + b.y;
}
还可以从内存分配角度对比:
动态类型语言 | |
---|---|
对类型极度严格 | 对类型非常宽松 |
立即发现错误 | Bug 可能隐藏数月甚至数年 |
运行时性能好 | 运行时性能差 |
自文档化 | 可读性差 |
看着动态类型这么多缺点,那么动态类型语言的支持者怎么说的呢?
动态类型语言的支持者认为:
- 性能时可以改善的(V8引擎),而语言的灵活性更重要
- 隐藏的错误可以通过单元测试发现
- 文档可以通过工具生成
资料对比:
关于强弱类型和静态动态类型的定义很多的人都有不同的定义,网上一搜一大把,随手摘抄一个在查阅资料的时常被搜到的的:
强类型:如果一门语言不对变量的类型做隐式转换,这种编程语言就被称为强类型语言 ;
弱类型:与强类型相反,如果一门语言对变量的类型做隐式转换,那我们则称之为弱类型语言;
动态类型:如果一门语言可以在运行时改变变量的类型,那我们称之为动态类型语言;
静态类型:与动态类型相反,如果一门语言不可以在运行时改变变量的类型,则称之为静态类型语言;
参考: https://www.cnblogs.com/nokiaguy/p/13599816.html
总结
关于动态和静态的区别,大家有比较一致的看法,其根本在于判断是在运行期间去做数据类型还是在编译期间检查。至于强类型和弱类型的区别,在当前阶段,如果你不是要做文章考究原理,或者写论文什么的,也没有必要区分那么清楚,确认到底Python是强类型还是弱类型如何如何,能明白自己使用语言的特性就好,如果有一天你全栈了,懂各种语言了,在更高层面上去统一分类也不迟。个人观点,轻喷。
其实过度强调静态、动态、强类型、弱类型,意义并不大。以为编程语言以后的发展方向是静态语言动态化,弱类型强类型化。都是互相渗透了,如果以后出现一种编程语言,同时拥有静态和动态的特性,其实并不稀奇。例如,尽管变量类型不允许改变,但允许动态为对象添加成员。就和光一样,既是光子(粒子),又是电磁波,也就是说光拥有波粒二象性! 编程语言也一样,也会同时拥有静动态二象性!