在前端快速发展的今天,如果不能时刻保持学习就会很快被淘汰。分享一下对JavaScript类型系统与Flow 相关知识的学习,希望对大家有所帮助。每天进步一点点。
一、编程语言的分类
1、从类型安全角度可以把编程语言分为强类型和弱类型。
强类型语言在语言层面就限制了函数的实参类型必须与形参类型相同,并且不允许任意的数据隐式类型转换;弱类型语言不会限制实参的类型,并且允许任意的数据隐式类型转换。
2、从类型检查(类型系统)角度可以把语言分为静态类型和动态类型
对于静态类型语言而言,一个变量在声明时它的类型就是明确的,并且声明过后,变量类型不可修改;动态类型语言在运行阶段才能够明确变量的类型,而且变量的类型随时可以变化【变量是没有类型的,变量中存放的值是有类型的】
二、JavaScript存在的问题
JavaScript语言属于弱类型而且是动态类型的语言,可以说JavaScript几乎没有任何类型的限制,所以这就丢失掉了类型系统的可靠性。在编写程序时,我们需要担心每一个变量到底是不是我们想要的类型。
JavaScript语言存在这种问题是因为,在早前的JavaScript应用简单,只需要几百行代码,甚至是几十行就搞定了,在这种情况下类型系统限制就显得很多余很麻烦。
1、弱类型的问题
// 1.一些异常要等到运行阶段才能发现
const foo = {}
foo.fn() // Uncaught (in promise) TypeError: foo.fn is not a function
// 如果在测试中没有测试到这种非立即执行代码,就会出现安全隐患
setTimeout(() => {
foo.fn()
}, 100000)
// 2.类型不明确可能造成函数功能发生改变
function addFun (a, b) {
return a + b
}
// 如果按照约定传入数值,得到正确的结果
console.log(addFun(100, 100)) // 200
// 传入非数字得到的结果就会异常
console.log(addFun(100, '100')) // 100100
// 3.对对象索引器的错误用法
con