类型系统

强类型与弱类型(类型安全)

强类型:
语言层面限制函数的实参类型必须和形参类型相同
强类型有更强的类型约束 而弱类型几乎没有什么约束
强类型语言当中不允许有任意的数据隐式类型转换
弱类型:
在语言层面不会限制实参的类型
语法上没有问题 但是运行上可能会报错
弱类型语言则允许任意的数据隐式类型转换
如 在js中 ‘100’ - 50 返回 50 并不会报错 这里的字符串100会被隐式转换成数字100

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

静态类型与动态类型(类型检查)

静态类型
一个变量 声明时 类型就是明确的 声明过后 他的类型就不允许再修改
动态类型
在运行阶段 才能明确一个变量的类型 而且变量的类型可以随时发生改变

JS类型系统特征

弱类型 且动态类型(灵活多变的)
但是 缺失了类型系统的可靠性

为什么 JS 不是强类型/静态类型

  • 早前 JS 应用简单
  • JS 没有编译环节
  • 在当时环境下没有问题 反而是优势

而现在 前端 应用的规模已经不同 很多大规模的应用
JS 代码也越来越复杂
在现在这种情况下 之前的优势 变成了现在的短板

弱类型的问题

  1. // JS 弱类型的问题
  2. //1 -------------
  3. // // 异常直到 运行时才被发现
  4. // const obj = {}
  5. // // obj.foo();
  6. // // obj中 并没有foo方法
  7. // // 等到运行阶段才能发现代码中的异常
  8. // setTimeout(() => {
  9. // obj.foo()
  10. // // 直到执行才能发现这个异常
  11. // }, 1000);
  12. // 2--------------
  13. // 类型不明确 造成功能发生了改变
  14. function sum(lhs, rhs) {
  15. return lhs + rhs;
  16. }
  17. // 传入正确 得到的是正常的
  18. console.log(sum(100,100));
  19. // 传入不正确 返回的结果不对
  20. console.log(sum(100,'100'));
  21. //3---------------
  22. // 对对象索引器错误的用法
  23. const obj = {}
  24. obj[true] = 100;
  25. console.log(obj['true']);
  26. // 对象属性名会自动转换成字符串
  27. // 军子约定有隐患,强制要求有保障
  28. // 强类型 在编码阶段就能消除一大部分的类型异常
  29. // 不像弱类型 需要在 运行时一遍遍的 Debug

强类型的优势

  1. 错误更早暴露 在编码阶段就能消除一大部分的类型异常
  2. 代码更加智能 编码更准确
    1. 在写 JS 时 很多时候 没有代码提示 单词拼错 名称记错就会造成一些问题
  3. 重构更牢靠
  4. 减少不必要的类型判断 ```javascript // 强类型的优势

// 代码更加智能 编码更准确 // 弱类型弊端: function render(element) { // element. // 无法提供智能提示 // 单词拼错 名称记错就会造成一些问题 }

// =============== // 重构更牢靠 // 弱类型弊端: const util = { // 假设这个 函数 有很多地方用到了 // 当我们需要修改的方法名的时候 无法立刻拿到那些地方用到了 aaa: () => { console.log(‘util’); } }

//============== // 减少不必要的类型判断 // 弱类型弊端: function sum(a, b) { if (typeof a !== ‘number’ || typeof b !== ‘number’) { throw new TypeError(‘arguments must be a number’) }

  1. return a + b;

} ```