编程语言类型的分类
JavaScript
是一种弱类型的语言, 且JavaScript
具有动态类型检查的特征。
强类型和弱类型
强类型语言是指当一个变量一旦被指定了数据类型之后,如果不经过强制转换,那么它就永远都是这个类型的了。
弱类型语言是指一个变量可以被赋值不同类型的数据。
动态类型和静态类型
静态类型语言和动态类型语言得核心区别在于,静态类型语言(statically-typed languages
)会在编译时(compile time
)进行类型检查,而动态语言(dynamically-typed
)则是在运行时进行类型检查(runtime
)
当出现一个类型错误时,静态类型检查和动态类型检查的差异就凸显出来了。在静态类型语言中,类型检查发生在编译阶段。在动态类型语言中,只有在程序运行了一次的时候错误才会被发现,也就是在运行时。
动态类型存在的问题
由于JavaScript
是动态类型语言,没有编译的环节,所有的类型检查是在代码运行时进行的,这就意味着我们书写的代码中的某些错误,只能在代码运行时在会被发现。
比如下面这段代码:
function greet(o){
// 这句代码,我们尝试去调用了obj的sayHello方法
// 在编码阶段,我们无法确定最终传进来的参数对象究竟是什么
// 只有在代码实际运行阶段,执行到本句代码的时候
// 才会发现传入的obj对象根本没有sayHello方法,最终在运行阶段报错
o.sayHello();
}
var obj = {
name: '张学友'
}
greet(obj);
再看下面这段代码:
/**
* 计算指定数值除以2的结果 我们期望用户传入的参数为数值类型
* @param {number} x
*/
function divideBy2(x) {
return x / 2;
}
// 用户在调用的时候如果传入数值,则功能正常
var res = divideBy2(4);
// 但是如果用户在调用的时候传入一个字符串,则会导致运行时错误
// (不报错,因为JavaScript解释器会尝试纠正错误,但是结果肯定不是我们预期的)
var res1 = divideBy2('Hello World');
当然,动态类型带来的并不只是问题,它的灵活程度和编码成本相较于静态类型的语言来讲是显而易见的。比如在Java和C#被类型限制的生活不能自理的同学,在JavaScript中你几乎可以放飞自我,为所欲为(Just a
joke)。
静态类型带来的好处
你可以尽早发现bug和错误
静态类型检查允许我们在程序没有运行之前就可以确定我们所设定的确定性是否是对的。一旦有违反这些既定规则的行为,它能在运行之前就发现,而不是在运行时。
因为类型检查器会在你编码的时候就告诉你错误,所以这也就比你把代码交付到客户手中才发现一些错误要更方面(或者说付出更少的开发与维护成本)。
提高代码的可读性
在代码中加入类型系统,可以清晰的告诉用户功能所需要的数据是什么类型的,函数的返回值是什么类型的,提升代码的可读性。
减少了复杂的错误处理逻辑
假设我们需要提供一个函数用来计算数组中所有数字的和
// 最基本的代码如下:
let sum = arr => {
let result = 0;
arr.forEach(v => {
result += v;
})
return result;
}
// 可是上面的代码对于可能出现的异常没有做任何的处理
// 为了保证函数能够正常的运行,我们需要确保用户传入的参数为有效的数字数组
// 那么就需要这么做
let sum = arr => {
if(!arr){
throw new Error("Please give me arguments");
}
if(!Array.isArray(arr)){
throw new Error("I need Array, what you've passed to me?");
}
if(!arr.every(v => typeof v == 'number')){
throw new Error("你传进来的数组里有奇怪的东西,我要的是数字!")
}
let result = 0;
arr.forEach(v => {
result += v;
})
return result;
}
如此我们便发现,如果没有类型系统,要处理类似的问题,代码显得非常繁琐。
当有了类型系统之后,这样代码就不需要再写了,在我们学习完flow
和typescript
之后我们回过头来再看这个例子。
促进更可靠的重构
假设要进行代码重构,我们需要将函数的某个参数进行修改,那么在之前修改的时候我们可能需要犹豫,因为指不定项目中某个地方调用没有进行修改,那么运行的时候会产生奇怪的问题。
而有了静态类型检测之后,类型检测会自动告诉我们修改后的代码哪里存在问题,我们只需要按照提示修复即可。
增强IDE的功能
静态类型会增强IDE的功能,提升开发效率。
静态类型存在的问题
- 会增加代码量
- 需要花时间掌握类型
- 可能会降低开发效率
如何在JavaScript开发中使用静态类型
- Flow: FaceBook的开源技术
- TypeScript: 微软公司开发的语言