类型安全:强类型与弱类型

类型安全角度来说,编程语言分为强类型和弱类型。

强类型:
在语言层面就限制了函数的实参类型必须要和形参类型完全相同

比如一个foo函数,他的形参是int,那么在调用的时候就不允许传入string等一些类型

Class Main {
    static void foo (int num) {
        System.out.println(num)
    }
    
    public static void main (String[] args) {
        Main.foo(100) // ok
        Main.foo('100') // error,  '100' is a string
        Main.foo(Integer.parseInt('100')) // ok
    }
}

弱类型则完全相反,在语言层面不会限制实参的类型。语法不会报错,但是运行可能会出现问题

强类型有更强的类型约束,弱类型中几乎没有什么约束

也就是说:
强类型语言中不许有任意的隐式类型转换,弱类型则允许。

在JavaScript中爆出的类型错误,都是逻辑判断在代码层面手动抛出的,而不是语法层面的类型限制。

变量类型允许随时变化的特点,不是强弱类型的差异

类型检查:静态类型与动态类型

在类型检查的角度,可以分成静态类型语言,动态类型语言

静态:一个变量声明时,他的类型就是明确的,在声明之后,类型是不可以修改的。

动态:在运行阶段才可以明确一个变量的类型,可以随时发生变化。

比如:

var foo = 100;

foo = 'bar'

console.log(foo)

在动态类型语言中,变量是没有类型的,但是变量里存放的值,是有类型的。所以JavaScript就是一门动态类型语言

这里有一张图能涵盖大多数我们常见的语言的类型:

JavaScript类型系统特征

几乎没有任何类型限制,丢失掉了可靠性。造成这种现象,归功于早期JavaScript的应用范围并没有如今这般规模,只作为一门脚本语言而言,他需要完成的内容简单到只需要几百行代码就可以实现,直接在运行环境中运行,换句话说,JavaScript他是没有编译环节的,设置为静态类型语言是没有什么意义的,因为静态类型语言需要在编译环节进行类型检查。所以JavaScript基于上述原因,成为了动态弱类型语言。

但是现如今前端应用规模越来越大,JavaScript代码会越来越复杂,周期也越来越长,以前的优势变成了短板。

弱类型的问题

我们提出来一些弱类型的问题,不代表JavaScript只有这么些问题,而是,这是一些例子,冰山一角:

// 1. 异常需要等到运行时才能发现
const obj = {}

obj.foo()

// 像这样的执行,就要等到1000秒之后才发现异常
// 如果测试中没有测试到这种情况,就会保留这样的隐患
setTimeout(() => {
  obj.foo()
}, 1000000)
// 2. 函数功能可能发生改变
function sum (a, b) {
  return a + b
}
// 200
console.log(sum(100, 100))
// 100100
console.log(sum(100, '100'))
// 3. 对象索引器的错误用法

const obj = {}

obj[true] = 100 // 属性名会自动转换为字符串

// 100
console.log(obj['true'])

强类型的优势

1.错误可以更早的暴露:在编码阶段就消灭大部分的类型异常

2.代码更智能,编码更准确

3.重构的时候会更加牢靠:重构就是破坏性改动,在此动作执行时,强类型可以更加牢固的保证不会出现额外的问题

4.减少代码层面不必要的类型判断

接下来我将从两个点来讲解类型处理工具:FLOW和Typescript,在后续的文章

最后修改:2024 年 03 月 21 日
收款不要了,给孩子补充点点赞数吧