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是强类型还是弱类型如何如何,能明白自己使用语言的特性就好,如果有一天你全栈了,懂各种语言了,在更高层面上去统一分类也不迟。个人观点,轻喷。

 

其实过度强调静态、动态、强类型、弱类型,意义并不大。以为编程语言以后的发展方向是静态语言动态化,弱类型强类型化。都是互相渗透了,如果以后出现一种编程语言,同时拥有静态和动态的特性,其实并不稀奇。例如,尽管变量类型不允许改变,但允许动态为对象添加成员。就和光一样,既是光子(粒子),又是电磁波,也就是说光拥有波粒二象性! 编程语言也一样,也会同时拥有静动态二象性!

posted @ 2022-09-22 09:47  佳明兄  阅读(24)  评论(0编辑  收藏  举报

内容仅为参考使用,不保证内容的正确性,通过使用本博客内容随之而来的风险与作者无关。内容如有侵权,请通知删除!