强类型与弱类型(类型安全)
强类型:
语言层面限制函数的实参类型必须和形参类型相同
强类型有更强的类型约束 而弱类型几乎没有什么约束
强类型语言当中不允许有任意的数据隐式类型转换
弱类型:
在语言层面不会限制实参的类型
语法上没有问题 但是运行上可能会报错
弱类型语言则允许任意的数据隐式类型转换
如 在js中 ‘100’ - 50 返回 50 并不会报错 这里的字符串100会被隐式转换成数字100
变量类型允许随时改变的特点 并不是强弱类型的差异
静态类型与动态类型(类型检查)
静态类型
一个变量 声明时 类型就是明确的 声明过后 他的类型就不允许再修改
动态类型
在运行阶段 才能明确一个变量的类型 而且变量的类型可以随时发生改变
JS类型系统特征
弱类型 且动态类型(灵活多变的)
但是 缺失了类型系统的可靠性
为什么 JS 不是强类型/静态类型
- 早前 JS 应用简单
- JS 没有编译环节
- 在当时环境下没有问题 反而是优势
而现在 前端 应用的规模已经不同 很多大规模的应用
JS 代码也越来越复杂
在现在这种情况下 之前的优势 变成了现在的短板
弱类型的问题
// JS 弱类型的问题
//1 -------------
// // 异常直到 运行时才被发现
// const obj = {}
// // obj.foo();
// // obj中 并没有foo方法
// // 等到运行阶段才能发现代码中的异常
// setTimeout(() => {
// obj.foo()
// // 直到执行才能发现这个异常
// }, 1000);
// 2--------------
// 类型不明确 造成功能发生了改变
function sum(lhs, rhs) {
return lhs + rhs;
}
// 传入正确 得到的是正常的
console.log(sum(100,100));
// 传入不正确 返回的结果不对
console.log(sum(100,'100'));
//3---------------
// 对对象索引器错误的用法
const obj = {}
obj[true] = 100;
console.log(obj['true']);
// 对象属性名会自动转换成字符串
// 军子约定有隐患,强制要求有保障
// 强类型 在编码阶段就能消除一大部分的类型异常
// 不像弱类型 需要在 运行时一遍遍的 Debug
强类型的优势
- 错误更早暴露 在编码阶段就能消除一大部分的类型异常
- 代码更加智能 编码更准确
- 在写 JS 时 很多时候 没有代码提示 单词拼错 名称记错就会造成一些问题
- 重构更牢靠
- 减少不必要的类型判断 ```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’) }
return a + b;
} ```