JavaScript语言类型

679 阅读2分钟

编程语言类型上有两种分类

  • 强类型和弱类型(类型安全)
  • 静态类型和动态类型(类型检查)

强类型:要求函数的实参类型要和形参类型相同,不可以随意隐式进行类型转换

弱类型:不限制形参类型,可以随意进行隐式类型转换

这两种类型的检查是在编辑层面进行区分,是在语言、语法层面的检查,编译时有强制类型检查是强类型,编译时时,类型检查没有太大限制是弱类型

JavaScript在语法层面没有强类型的检查,运行时出现的类型错误,都是运行时进行逻辑判断所报错的

  • 静态类型:一个变量声明时,它的类型是明确的,声明过后不可以再修改类型
  • 动态类型:类型是运行时才能确定,变量类型是可以随意改变的(变量是没有类型的,变量的值是有类型的)

JavaScript就是弱类型且动态类型的语言,它的类型系统检查很薄弱,缺少类型系统的可靠性,安全检查很弱,原因是早期JavaScript应用很简单,不需要强制类型,而且是脚本语言没有编译环境

弱类型的一些问题

对象调用一个不存在的方法,要等到运行时才能发现异常

const obj = {}
console.log('----') // 输出正常
obj.foo() // 运行到这一行才能发现错误

实参和形参类型不同导致运行结果和预想不一致

function sum (a, b) return a + b
console.log(sum(100, 200)) // 正确的类型调用
console.log(sum(200, '300')) // 错误的类型 调用结果和预想不一致

对象的键的是字符串和Symbol,但可以传入其他类型,会自动转型,但不符合逻辑

const obj = {}
obj[true] = 123 // 自动转成字符串 'true' 但这种转换是不符合逻辑
console.log(obj['true'])

强类型语言优势

  • 错误可以更早暴露(在编译阶段发现类型错误)
  • 编码更加准确、有效(编辑工具可以对强类型语言就行智能提示)
  • 重构更加可靠
  • 可以减少不必要的类型判断代码