js语言特征介绍
js是一种弱类型 动态类型检查的语言
弱类型?
再定义变量的时候,我们可以为变量赋值任何数据,变量的类型不是固定的,这样的类型叫弱类型,如
var a = 10;
var a = function () {}
强类型?
以java为例,在声明变量的时候,一旦给变量赋值,那么变量的数据类型就已经确定,之后如果要给变量赋值其他类型的数据,需要进行强制数据类型转换
int a = 10; //定位为整型
a = "10"; //这样是不允许的,如果非要赋值,先转换成整型再赋值 a = parseInt("10")
动态类型和静态类型
两者的核心区别: 动态类型的检查会在代码运行的时候进行检查,而静待类型的类型检查则是再编译时
var obj = {};
obj.forEach(function(v,i){}) //运行时报错,
结论:js 运行时类型检查,为动态类型语言
int a = 10;
a = "10"; //编译时报错,还没运行
结论:java 编译时类型检查,为静态类型语言
静态动态类型的影响
例如下段代码,想要的功能是参数arr数组内成员相加;
但这时若参数不是数组,或者不传参…… 为引起程序报错
静态检查类型时,在编译时报错
动态检查则在运行时报错,不能提前发现bug
function sum(arr) {
let result = 0
arr.forEach(v => {
result += v
})
return result
}
sum()
为了使代码健壮 我们常规需要在代码里这样做,才够使代码稳定,里边非必要的代码 在静态类型中是非必要的,但是在动态类型里确不得不写;
function sum(arr) {
//非必要代码
if (!arr) throw new Error('函数需要传参')
if (!Array.isArray(arr)) throw new Error('函数需要一个数组作为参数')
if (!arr.every(v => typeof v === 'number')) throw new Error('函数需要的数组为数字数组!')
//非必要代码结束
let result = 0
arr.forEach(v => {
result += v
})
return result
}
sum()
sum('d')
sum([1,2])
为了解决 上述注释的内容 ,就是把js变成静态类型的语言;
如何在js开发中使用静态类型呢? 就是应用Flow与TypeScript;
本次先进行Flow的分享
1.Flow
FackBook的开源技术,轻量 ,上手容易
https://flow.org/ 英文文档2.TypeScript 微软公司开发的语言,稍重,出现时间较早
缺点:
- 增加代码量
- 花时间掌握类型
- 可能会降低开发效率
优点:
- 促进更可靠的重构
假如在项目中我们要对调用方法的 参数进行修改,以前我们会犹豫凡是调用的地方改全与否,而有了静态类型检查,类型检查会自动告诉我们修改后的代码哪里存在问题,我们指需要按照指示修复即可
- 静态类型增强IDE的功能