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

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

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

  1. HTML5学习笔记 —— JavaScript基础知识

    HTML5学习笔记 -- JavaScript基础知识 标签: html5javascriptweb前端 2017-05-11 21:51 883人阅读 评论(0) 收藏 举报 分类: JavaScr ...

  2. JS学习笔记——入门基础知识总结

    JS入门基础知识总结1 前言 基础背景知识 一.产生历史: 二.特点: 三.应用方向: 四.Javascript组成: JavaScript书写使用方式 一.行内式(了解即可,项目中不使用,日常练习尽 ...

  3. 笔记-项目管理基础知识-复习要点

    1. 项目的特点 临时性(一次性).独特性.渐进明确性 2. 项目目标包括成果性目标和约束性目标 ●笔记-项目管理基础知识-项目目标 3. 项目目标的特点 多目标性.有限性.层次性 4. ▲项目管理5 ...

  4. 数字图像处理与Python实现笔记之基础知识

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  5. php基础教学笔记,php学习笔记:基础知识

    php学习笔记:基础知识 2.每行结尾不允许有多余的空格 3.确保文件的命名和调用大小写一致,是由于类Unix系统上面,对大小写是敏感的 4.方法名只允许由字母组成,下划线是不允许的,首字母要小写,其 ...

  6. 【学习笔记--FMCW基础知识】

    学习笔记--FMCW基础知识 前言 mmWave测距原理 mmWave区分多个物体 mmWave的距离分辨率(Range Solution) mmWave的最大测量距离 前言 由于工作原因需要了解TI ...

  7. python 图像分析自然纹理方向与粗细代码_数字图像处理与Python实现笔记之基础知识...

    数字图像处理与Python实现笔记之基础知识 摘要 绪论 1 数字图像处理基础知识 1.1 数字图像简介 1.1.1 数字图像处理的目的 1.1.2 数字图像处理的应用 1.1.3 数字图像处理的特点 ...

  8. 咸鱼Maya笔记—动画基础知识

    咸鱼Maya笔记-动画基础知识 动画基本原理 动画基本分类 动画基本界面与命令 预设动画参数 在Maya 2019中,一个对象被创建完成后,它的所有节点属性,包括模型的位移.大小.旋转,以及场景中材质 ...

  9. 【笔记】Python学习(廖雪峰)笔记①——Python基础知识

    Python学习(廖雪峰)笔记①--Python基础知识 Python 基础知识 字符串与编码 ASCII.Unicode.UTF-8 Python字符串 格式化 使用list和tuple list( ...

最新文章

  1. 机器学习神器Scikit-Learn保姆教程!
  2. spellchecker.php 漏洞,整理一些大汉版通的漏洞
  3. 隐藏input边框(ie6、ie7)
  4. 树莓派设置NTP同步
  5. 设计模式之“适配器模式”
  6. Django中的Form ModelForm
  7. selenium-03-常用操作
  8. RxJava2.0的初学者必备教程(九)
  9. 海尔智能微型计算机,微型计算机 Microcomputers
  10. css学习笔记(一)
  11. 理解JavaScript内联命名函数---var fun = function f() {}
  12. 【利用WPS功能破解密码】笔记
  13. Tensorflow学习笔记 (用 tf.data 加载图片)
  14. 技术年货:美团技术沙龙合辑大放送——85个演讲,70+小时视频
  15. android 进制转换的方法
  16. java 量化指标_量化投资学习笔记13——各种指标的绘图、计算及交易策略
  17. 最常被遗忘的 Web 性能优化:浏览器缓存
  18. C++ 语法 const限定符
  19. 快速微信群内接龙统计避免刷屏
  20. 【mcuclub】称重-HX711

热门文章

  1. ps4刷linux,PS4刷新GPU固件有惊喜 可运行Vulkan与Linux
  2. 2009上海企业100强排序名单
  3. 学习opencv:PS滤镜—查找边缘
  4. 学习笔记(23):第一章: 路由与模板-Web前端技术与框架 4
  5. 13.数据结构:二分搜索树
  6. C++适合游戏开发,那用C++写游戏有什么优缺点?你知道吗?
  7. 【中国善网】爱心接力,呵护女生健康
  8. Shader笔记——使用粒子序列图实现体积云
  9. 在c语言中逻辑运算符的优先级是,c语言中逻辑运算符优先级是什么?
  10. 简易的选择排序与快速排序