当前位置: 首页 > Web前端 > HTML

JavaScript类型系统

时间:2023-04-02 13:10:04 HTML

CategoryTypeSystemType安全-强类型VS.两种类型检查之间的弱类型差异——静态类型VS。动态类型JavaScript类型系统的两种特性的区别为什么JS是弱类型和动态类型?为什么我们需要类型检查?弱类型的缺点和强类型的优点JavaScript自身类型系统问题的解决方案关于搜索资料编译型语言和解释型语言的知识点补充编译型语言解释型语言本文将首先讨论一些概念,我们将讨论它我在开始学习JavaScript时就知道了。JavaScript是一种弱类型和动态类型的语言,所以这里整理一下这些概念。之后,我们将重点关注JavaScript自身类型系统存在的问题,以及如何借助一些优秀的技术方案来解决这些问题。类型系统我们经常使用两个维度来描述编程语言的特性。不要混淆这两个维度。强类型不是动态类型……强类型和弱类型,是从类型安全的维度来划分的。静态类型和动态类型,从类型检查的维度来分类类型安全——强类型VS。弱类型强类型:要求语言级别限制函数的实参类型与形参类型相同。弱类型:语言级别不限制实参的类型。下面是一个例子://JavaclassMain{//这里定义了传入参数是int类型,所以实际应该是int类型staticvoidfoo(intnum){System.out.printIn(num);}publicstaticvoidmain(Sting[]args){//下面如果是int类型就通过,如果不是int类型就报错Main.foo(100);//好的Main.foo('100');//错误“100”是一个字符串Main.foo(Integer.parseInt("100"));//好的}}//------------------------------//JavaScript//传递时没有指定类型,所以不管实参是什么类型都会报错functionfoo(num){console.log(num)}foo(100)//okfoo('100')//okfoo(parseInt('100'))//ok因为strong类型和weak类型不是权威机构的定义,所以后来的人有不同的理解配方的细节。粗略地说,强类型有更强的类型约束,而弱类型几乎没有约束。两者的区别在于强类型语言不允许任何隐式类型转换,而弱类型语言允许任意数据隐式类型转换。//JavaScript//js报错都是代码层面的。它们是在运行时通过逻辑判断手动抛出的,在语法层面不受类型的限制。//下面的'100'是一个字符串,在做减法的时候进行了隐式类型转换,转换为Number类型,最终结果为50,Number类型。>'100'-5050//后面的字符串进行隐式类型转换,不是数字的变成NaN(不是数字)>Math.floor('foo')NaN//布尔值进行隐式类型转换,并且areconvertedtonumbers1>Math.floor(true)1#python#这里不能进行隐式类型转换,会报语法层面的类型错误>'100'-50TypeError:unsupportedoperandtype(s)for-:'str'and'int'>abs('foo')TypeError:badoperandtypeforabs():'str'typechecking——静态类型VS。动态类型比较统一,没有争议静态类型:变量在声明的时候,其类型是明确的,一旦声明,类型就不能修改。动态类型:变量的类型只能在运行时明确,变量的类型可以随时改变。所以动态类型语言中的变量是没有类型的,变量中存储的值是有类型的。//JavaclassMain{publicstaticvoidmain(String[]args){//num的类型一开始设置为int,如果修改只能改为int类型,如果改为string,会报错intnum=100;数=50;//正常num='100'//错误System.out.printInt(num);}}//JavaScript//可以随意修改num的类型varnum=100num=50//oknum='100'//oknum=true//okconsole.log(num)的区别静态类型不能修改变量类型,动态类型可以随时修改变量类型。JavaScript类型系统的特点JavaScript是一种弱类型和动态类型的语言,灵活多变,可以进行隐式转换和类型推断,但缺乏类型系统的可靠性。为什么JS是弱类型和动态类型?早期的JavaScript应用程序很简单,因此没有复杂的类型系统。JavaScript是一种没有编译的脚本语言,所以把它设计成静态语言是没有意义的。为什么我们需要类型检查?因为现在的JavaScript应用越来越复杂,开发周期越来越长,越来越大的项目上百行代码已经不能满足现状了,所以现在弱类型已经成为一种JavaScript的缺点。这些事情只能通过约定来避免,但是在大型项目中通过人为约定存在隐患。弱类型的缺点是代码异常只能在运行阶段发现,代码不执行时无法发现代码异常。在深度隐藏的情况下,测试不能覆盖100%。constobj={}obj.foo()//TypeError:obj.fooisnotafunction//下面的延迟器会在时间到后运行,给测试带来麻烦setTimeout(()=>{obj.foo()},100000)函数参数类型不确定,输入结果有偏差//歧义是数字,所以结果不同functionsum(a,b){returna+b}console.log(sum(100,100))//200console.log(sum(100,'100'))//100100隐式类型转换将对象属性名转换成字符串,里面的内容会有很多问题//定义一个字符串,对象的属性名不能是对象,会自动转成字符串,不满足会出问题constobj={}obj[true]=100obj[{name:1}]=1console.log(obj)//{true:100,[objectObject]:1}console.log(obj['true'])//100console.log(obj[[objectObject]"])//1强类型的优点开发中出现错误都会暴露出来,越早发现越好,代码越聪明,编码越准确(开发工具的智能提示因为变量类型有提示)重构更可靠(如果项目中多处使用该成员,需要删除或修改该成员使用弱类型语言时,会有隐患)减少不必要的类型判断函数sum(a,b){if(typeofa!=='number'||typeofb!=='number'){thrownewTypeError('argumentsmustbeanumber')}returna+b}JavaScript自由类型系统问题的解决方法后面会在这里补充flow-JavaScriptstatictypecheckerTypeScript-JavaScriptsuperset关于查资料Forcompiledlanguagescompiledlanguage使用一种特殊的编译器,针对特定的平台,将高级语言源代码编译成平台硬件一次可以执行的机器码,并打包编译型语言一次性编译成平台相关的机器语言文件,成为平台可以识别的可执行程序格式。运行时脱离开发环境,与特定平台相关。一般不能移植到其他平台。现有的C、C++、Objective等都是编译型语言。解释型语言使用专用的解释器将源程序逐行解释为特定平台的机器码并立即执行。Yes代码在执行时由解释器动态翻译成机器语言逐行执行,而不是在执行前完成翻译。每次运行解释性语言时,都需要将源代码解释为机器码并执行。只要平台提供相应的解释器,就可以运行源码。Python、Java、JavaScript等都是解释型语言。