TypeScript作为前端领域的第二门语言,随着前端领域的快速发展,未来TypeScript可能会成为前端技能的必备。原因很简单,JavaScript自身存在类型系统不足的问题,在长周期开发的大型项目中,有很多的隐患。
本文先介绍语言的强类型与弱类型、静态类型与动态类型这些基础概念作铺垫,再剖析JavaScript类型系统不足的问题。
文章目录
- 一、强类型与弱类型(从类型安全的角度划分)
- 二、静态类型与动态类型 (从类型检查的角度划分)
- 三、JavaScript自有类型系统的问题
一、强类型与弱类型(从类型安全的角度划分)
区别:是否能够隐式类型转换
强类型会在语言层面限制函数的实参类型必须与形参类型相同,而弱类型在语言层面不会限制实参的类型。
即强类型语言中不允许任意的隐式类型转换,而弱类型语言则允许任意的隐式类型转换。
变量类型允许随时改变的特点,不是强弱类型的差异。如python是强类型语言,它的变量可以随时改变。
二、静态类型与动态类型 (从类型检查的角度划分)
区别:是否能够随时改变变量类型
静态类型:一个变量声明时它的类型就是明确的,声明过后,它的类型就不允许再修改。
动态类型:运行阶段才能够明确变量类型,而且变量的类型随时可以改变。
var foo = 100
foo = 'bar' //ok
console.log(foo)
动态类型语言中的变量没有类型,而变量中所存放的值是有类型的,js就是标准的动态类型语言,如上。
三、JavaScript自有类型系统的问题
- 弱类型且动态类型【任性,缺少了类型系统的可靠性】
- js是脚本语言,没有编译环节
小应用就很方便,但如今js已大规模运用,所以这种优势就成了短板。
(1)弱类型的问题
- 只有在代码运行时才能检查出错误,而强类型则直接在编译时就能检查出问题。
const obj = {}
// obj.foo()
setTimeout(() => {
obj.foo()
},10000)
- 类型不明确可能会造成函数功能发生改变
function sum(a,b) {
return a + b
}
console.log(sum(100,100))
console.log(sum(100,'100'))
- 弱类型会造成我们可能对对象索引器的错误用法
const obj = {}
obj[true] = 100
console.log(obj['true'])
以上问题在代码量小时可以通过约定来避免,但项目代码量一大,可能不是所有人会遵守约定,会隐藏有很多bug,还是强类型有保障。
(2)相比于弱类型,强类型有如下优势
- 错误更早暴露
- 代码更智能,编码更准确(强类型的代码提示较多)
- 重构更牢靠(如修改了一个方法后,如果是js则调用这个方法的地方不会报错,ts的话编译就会报错了)
- 减少不必要的类型判断(强类型不用对函数的参数另外加判断,因为参数本身就有要求了)
总结:JavaScript是弱类型且动态类型的语言,自身存在类型系统不足的问题,然而TypeScript能够解决它的不足,因此,在长周期开发的大型项目中,TypeScript往往更适合作为首选的开发语言。