从类型安全角度来比较,可以分为以下:
强类型与弱类型
强类型:语言层面限制函数的实参类型必须与形参类型相同
弱类型:语言层面不会限制实参的类型
javascript中允许隐式转换
>'100' - 50
50
>Math.floor(true)
1
从类型检查角度来比较,可以分为以下:
静态类型与动态类型
静态类型:一个变量声明时,类型就是明确的,并且声明过后、类型不允许再修改
动态类型:在运行阶段,才能明确变量的类型,在运行过程中类型也会发生变化
JavaScript类型系统特征
Javascript是弱类型 且 动态类型,缺失了类型系统的可靠性
以前应用比较小,JavaScript也没有编译环节,所以它成为一个弱类型/动态类型的语言,这也并没有什么问题。设置可以说,这也是javascript的一种优势。
但是现在和以前完全不同了,都是一些非常复杂的应用,开发周期也越来越长。在这种情况下,之前JavaScript的优势(弱类型、动态类型)就变成了短板。
弱类型产生的问题:
// 在语法层面这样写没有问题
// 必须等到运行的时候才发现问题
const obj = {}
obj.foo()
// 假如这行代码不是立即执行,而是过一段时间,获取在其他的方法中。
// 测试如果没有执行到这个方法就不会报错
// 这样就留下了隐患
setTimeout(() => {
obj.for()
}, 10000000)
------------------------------------------------------------------------
// 参数类型不明确,函数功能发生变化
function sum(a, b) {
return a + b
}
console.log(sum(100, 100))
// => 200
console.log(sum(100, '100'))
// => 100100
------------------------------------------------------------------------
// 对对象错误用法
const obj = {}
obj[true] = 100
// 对象内部会将属性名转换为字符串
console.log(obj['true'])
// => 100
强类型的优势
1.错误更早暴露,可以在编码阶段提前暴露异常
2.代码更智能,编码更准确。(编辑器时时刻刻都知道变量是什么类型)
3.重构更牢靠
4.减少不必要的类型判断(在javasript中,我们需要用代码去做一些类型判断)