类型前置

什么是数据类型?

如果你是一名程序员,那你一定使用过变量、函数参数或者函数返回值,它们都用来表示数据,在编程语言中无处不在;
但是,你是否知道它们的真正含义呢?又是否知道它们在后台如何控制计算机的呢?

在很多如 C/C++/C#、Java 编程语言中,定义变量时除了需要指明变量的名字,还需要告诉计算机它是什么类型,比如简单的整数、浮点数、字符串,还有复杂的类、结构体、数组。

编程语言中的数据最终都要放到内存中,在内存中存取数据要明确三件事情:数据存储地址、数据的长度以及数据的处理方式。

  • 数据存储地址决定了数据放在哪里;
  • 数据类型,决定了其数据长度,数据长度又决定了当前数据使用了多少个字节的内存;
  • 数据类型与决定了数据处理方式 不仅让计算机能够正确转换数据的内容,不至于导致“乱码”,还让计算机知道如何处理基于该数据的各种运算,比如加减乘除。

变量名不仅仅是为数据起了一个好记的名字,还告诉我们数据的存储地址,使用数据时,只要提供变量名即可,变量名会自送转换成数据在内存中的地址。而数据类型则指明了数据的长度和处理方式,它确定了除地址以外的其它所有信息。

静/动态类型语言

静态类型和动态类型应该放在一起提及,它们从「如何得到数据的类型」这一维度来评价类型系统。

核心区分

静态类型语言:在定义的时候就要指定变量的类型,而且类型不会在之后变,然后根据类型为其分配分配长度、存储内存、和提供处理数据方式
动态类型语言:第一次赋值给变量时,根据其值推导出来,后续赋值类型若不同,这个变量的类型也会随之改变

test.js
let i = 123;
console.log(typeof i); // number 自动推导类型为number
i = '456';
console.log(typeof i); // string 后续赋值类型若不同 类型也会随之改变
test.java
int i = 123;
i = "456"; // 编辑器会提示报错,编译阶段也会提示报错 Type mismatch: cannot convert from String to int

对比好处

1、工具支持上,编辑器ide会根据静态语言定义的类型提供智能提示,但是动态语言基本很难做到
2、阅读友好性上,静态语言在二次开发或者阅读代码的时候比较友好,你可以很清楚的看到参数和返回类型进而推断出业务逻辑,但动态则是编写一时爽,重构火葬场,尤其是设涉及到业务复杂的地方,代码惨不忍睹
3、在发现错误时机上,静态类型语言存在编译阶段,很多错误如 因类型错误而不能做的事情(语法错误)就可以发现。而动态类型语言不存在编译阶段,很多错误都是在运行阶段才发现
4、编写舒适性上,这个动态语言扳回一局,写起来不用考虑类型局限,编码会很流畅 Java程序员还在那里定义接口,定义数据类型。js工程师已经快速干完活,回家老婆孩子热炕头了

强/弱类型定义语言

强/弱类型指的是编程语言如何处理运算过程中的值。当值的类型不符合运算规则时,编程语言究竟是做出一些猜测,临时转换值的类型以帮助人们解决问题,还是停止运行,提醒人们不应该这样做。

核心区分

强类型定义语言:很少合理隐的隐式类型转换
弱类型定义语言:有较多过分的隐式类型转换

对比好处

1、若语言自动转换类型很方便,但是有时候会出现转换不是那么智能 2、强语言写起来很麻烦,不确定的很多地方都会报错。这就保证了代码稳定,先天健壮性强

var i = 2;
console.log(i+'1'); // 输出21 自动将i转换string类型
var j = '3';
console.log(j-2); // 输出1 自动将j转换number类型

相比之下,强类型语言这么做运算, 编译阶段就开始报错了,而且编辑器也会直接提示存在问题。

不过 很少合理隐的式类型转换 也不一定都是弱类型定义语言,如java

test.java
int i = 1/3; // 如果我们这里将变量i定义为int类型,则会丢失精度(此处是隐式转换,但是只能从高精度转向低精度,但并不能说java是弱类型语言)
System.out.println(i);  // 输出0

ts的诞生

js是弱/动态语言。
随着前端项目的日益庞大,以及nodejs让js也开始处理大量业务逻辑,js的这些缺点被无限放大!
于是typescript就孕育而出,它的出现就是解决前端这些问题!