Typescript笔记之基础知识(1):强类型语言和弱类型语言、静态语言和动态语言

article/2025/8/29 14:21:43

foreword(前言)
这是本人关于Typescript的第一篇笔记,之所以选择将“强类型语言和弱类型语言、静态语言和动态语言”作为第一个想要去总结的主题,是因为个人觉得它很重要。

如今这个年代,可以供我们选择的编程语言非常之多,我们也不能在我们的编程生涯中仅仅只使用一门语言(除非你能够不断钻研一门语言并达到业界先驱者的层次),所以当我们在使用不同的编程语言时,如果我们连各种语言的性质、区别都不知道的话,我们如何在正确的场合、领域去使用某一种语言并尽可能发挥其优势呢?

所以,正因为如此,我觉得“强类型语言和弱类型语言、静态语言和动态语言”这个主题我有必要优先去理清它。

Javascript是一门动态弱类型语言,相应的,也会有静态强类型语言。也就是说,语言可以分为强类型语言和弱类型语言、静态语言和动态语言。

以下内容基本摘自“极客时间梁宵的视频教程——Typescript”,为了方便回顾,以笔记的方式进行记录。

强类型语言和弱类型语言

什么是强类型语言和弱类型语言?

1.强类型语言

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

这是1974年两位计算机科学家对强类型语言的定义,那我们如何去理解这句话呢?

让我们来看一下下面的伪代码:

A() {B(x)
}B(y) {// x可以被赋值给x,且程序能够运行良好
}

上面伪代码中,A函数中调用B函数,并传入参数x,前面说到的定义就是说参数x能够被赋值给y,并保证函数B的正常运行。

到目前为止,这个定义还是比较宽泛模糊的,所以后人给出了更加精确的定义:

强类型语言不允许改变变量的数据类型,除非进行强制类型转换。

即我们声明的变量,不能被赋值其他类型的变量,除非对赋值的变量先进行强制类型转换。

2.弱类型语言

与强类型语言相反,弱类型语言中,变量的值其类型是宽泛的,可以被赋值多种类型的值,比如我们使用的javascript,假如声明了一个变量a,a的值可以是数字1,可以是字符串“abcd”,也可以是对象、数组、函数。。。

静态语言和动态语言

首先,给出一个比较通俗的定义:

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

首先看一段js代码:

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;
}

上面代码在被编译时,完全不知道变量a和b是什么类型,只有当程序运行时,对a、b参数传入值时,才知道变量a和b是什么类型。

接着,我们再看一段功能类似的C++代码:

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

C++代码在编译的时候就已经能确定变量a和b的类型了。

接下来,再从内存分配的角度进行对比:

1.Javascript

  • 在程序运行时,动态计算属性偏移量(对象中的属性a、b相对于对象基地址的偏移量);
  • 需要额外的空间存储属性名;
  • 所有对象的偏移量信息各存一份;

2.C++

  • 编译阶段确定属性偏移量
  • 用偏移量访问代替属性名访问
  • 偏移量信息共享;

总结

强类型语言弱类型语言
强类型语言不允许改变变量的数据类型,除非进行强制类型转换弱类型语言中,变量的值其类型是宽泛的,可以被赋值多种类型的值
静态类型语言动态类型语言
对类型极度严格对类型非常宽松
立即发现错误Bug可能隐藏数月甚至数年
运行时性能好运行时性能差
自文档化可读性差

基于上面,我们多半会觉得静态语言明显好于动态语言啊,为什么JavaScript现在这么火呢?

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

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

所以,任何语言其都具有两面性,同时也是在不断发展与进化的,不能一概而论。

最后给出一张象限图:

在这里插入图片描述

last(最后)
非常感谢您能阅读完这篇文章,您的阅读是我不断前进的动力。

对于上面所述,有什么新的观点或发现有什么错误,希望您能指出。

最后,附上个人常逛的社交平台:
知乎:https://www.zhihu.com/people/bi-an-yao-91/activities
csdn:https://blog.csdn.net/YaoDeBiAn
github: https://github.com/yaodebian

个人目前能力有限,并没有自主构建一个社区的能力,如有任何问题或想法与我沟通,请通过上述某个平台联系我,谢谢!!!


http://chatgpt.dhexx.cn/article/Kh1jgpIt.shtml

相关文章

编程语言的执行方式、静态语言和脚本语言

计算机执行源程序的两种方式是编译和解释 源代码:采用某种编程语言编写的计算机程序,人类可读 目标代码:计算机可以直接执行,大部分人类不可读,如:1110000111001010 编译 编译是讲源代码一次性转换为目标代…

程序的两种执行方式,静态语言和脚本语言

程序的两种执行方式,静态语言和脚本语言 文章目录 程序的两种执行方式,静态语言和脚本语言编译和解释静态语言和脚本语言 编译和解释 编译:将源代码一次性转换成目标代码的过程。(编译一次后,若需再次执行程序就可以直…

静态语言和脚本语言的区别

在计算机编程语言中,可以将编程语言分为静态语言和脚本语言两类,这两类编程语言最主要的区别是执行方式的不同。想要区分静态语言和脚本语言的区别,首先需要区分编译和解释。 编译和解释 编译是指将源代码一次性转换为目标代码的过程&#…

Java是动态语言还是静态语言,是强类型还是弱类型?

一. 前言 今天小熙突然想到一个问题,那就是Java到底是动态语言还是静态语言,是强类型还是弱类型呢?虽然知道但是还是不够深入,接下来就一起探讨下吧。 二. 图释 小熙碰巧看到一张图,完美的区分了以上的问题&#xf…

高级数据结构—斐波那契堆与二项堆详细介绍

斐波那契堆与二项堆 二项堆请点击这里👈 数据结构与堆斐波那契堆概述结构实现符号定义插入结点合并抽取最小结点分析Decrease Key第一种情况 删除最大度数的界 二项堆请点击这里👈 数据结构与堆 下图列出了小顶堆在各种数据结构(链表、二叉堆、二项堆、…

数据结构——斐波那契堆

斐波那契堆的介绍 斐波那契堆(Fibonacci heap)是一种可合并堆,可用于实现合并优先队列。它比二项堆具有更好的平摊分析性能,它的合并操作的时间复杂度是O(1)。与二项堆一样,它也是由一组堆最小有序树组成,并且是一种可合并堆。与二…

《算法导论3rd第十九章》斐波那契堆

前言 第六章堆排序使用了普通的二叉堆性质。其基本操作性能相当好,但union性能相当差。 对于一些图算法问题,EXTRACT-MIN 和DELETE操作次数远远小于DECREASE-KEY。因此有了斐波那契堆。 斐波那契堆结构 斐波那契堆是一系列具有最小堆序的有根树的集合…

斐波那契堆(Fibonacci heaps)

一:斐波那契堆 1:特性 斐波那契堆同二项堆一样,也是一种可合并堆。斐波那契堆的优势是:不涉及删除元素的操作仅需要O(1)的平摊运行时间(关于平摊分析的知识建议看《算法导论》第17章)。和二项…

3.3 斐波那契堆

结构 斐波那契堆的基础是可合并堆。 数据结构是一个森林。也就是N棵树。这点和二项堆一样。 这个结构没有二项堆那么多的要求。 Rank的概念,是子节点的数目 与二项堆不同的是,斐波那契堆的底层链表要成环,要双向链表。   而斐波那契堆的节点&#xff…

二叉堆/二项堆/斐波那契堆

二叉堆 二叉树 二叉树:是树的一种,主要的特点是二叉树的所有节点最多只有两个叶节点。除此之外没有别的要求完全二叉树:就是在二叉树当中,除了最后一层之外,所有层的节点都有满的,且最后一层的节点也是从…

斐波那契堆(Fibonacci heap)原理详解

前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间。堆的名字来源于斐波那契数,它常用于分析运行时间。 堆结构介绍 基本术语介绍: 关键字:堆节点储存的…

斐波那契堆 - 解析与实现

概要 本章介绍斐波那契堆。和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现。后续再分别给出C和Java版本的实现;实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可。若文章有…

算法导论 斐波那契堆

算法导论 斐波那契堆 定义 堆H 最小结点min:指向最小关键字key的根结点n表示当前堆中结点的个数 结点x 最小堆性质:每个结点的关键字key均大于等于父结点的关键字根链表:所有的根结点都通过left,right指针形成一个环形链表父类指针为p,左右兄…

斐波那契堆(Fibonacci heap)原理详解(附java代码实现)

前言 斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质,但比二项式堆有更好的均摊时间。堆的名字来源于斐波那契数,它常用于分析运行时间。 堆结构介绍 基本术语介绍: 关键字:堆节点储存的…

斐波那契堆

斐波那契堆 作者: 大树先生 博客: http://blog.csdn.net/koala_tree GitHub:https://github.com/koalatree 2017 年 09 月 13 日 自《算法导论》. 斐波那契堆有两种用途:第一种,支持一系列操作,这些操作…

斐波那契堆(Fibonacci Heap)

也许我们每个人都知道斐波那契数列(Fibonacci sequence)。即这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...,如果我们用伪代码比表示: int FibonacciSequence(int n){if (n 1 || n 2) {return 1;}return FibonacciSequence(n …

斐波那契堆(一)之 图文解析 和 C语言的实现

出自:http://www.cnblogs.com/skywang12345/p/3659060.html 斐波那契堆(一)之 图文解析 和 C语言的实现 概要 本章介绍斐波那契堆。和以往一样,本文会先对斐波那契堆的理论知识进行简单介绍,然后给出C语言的实现。后续再分别给出C和Java版本…

斐波那契堆的C++实现

本文改编自《算法导论》第三版第19章:斐波那契堆。文中代码为书中伪代码的C实现,如有疏漏还请指出。 1.斐波那契堆的结构 斐波那契堆是一种可并堆,它支持以下操作: ( 1 ) (1) (1)在 O ( 1 ) O(1) O(1)时间内插入元素、获取最小…

常见电子元器件检测方法。——Arvin

电子设备中使用着大量各种类型的电子元器件,设备发生故障大多是由于电子元器件失效或损坏引起的。因此怎么正确检测电子元器件就显得尤其重要,这也是电子维修人员必须掌握的技能。我在电器维修中积累了部分常见电子元器件检测经验和技巧,供大…

电工电子复习题

1、应用叠加定理时,理想电压源不作用时视为______, 理想电流源不作用时视为____。 2、电容元件具有“通_____隔_____”的特性, 电感元件具有通___阳___ ”的特性,。 3、已知:“u 60sin(628t -135度)(v),则其有效值为____V,角频率为…