第一次写文章,不足之处还望多多指正,进入正题。 当我们被面试官问到这个问题时,不能上来就罗列变量声明方式不同/数据类型不同/TS新增了类型推断拥有丰富的class扩展。。。low太low了,聪明的同学就问了,那应该怎么回答呢? 大写且夸张的(OK),轮到我装了
首先我们应该抛出什么是JS:javascript是一种动态类型、弱类型的直译型脚本语言。
那typescript是什么呢?哎对!很多聪明的同学一下就明白过来了,TS他是一种静态类型、强类型的编译型脚本语言。 这样你是不是一下子就有思路了呢?
- 那我们继续往下说,什么是动态类型?它与静态类型有什么区别?
- 动态类型语言永远不会给一个任何变量指定数据类型,只有当程序运行的时候,变量被赋值后才会具有某个类型。这就是js所有变量被提升后初始值都是undefined的原因。
- 那么动态类型的优缺点是啥呢?优点很亮眼:变量名可以重复使用,实现灵活、开放、精简的代码(不需要写一堆数据类型相关代码)只关注业务逻辑就行。
- 缺点自然也明显:那就是无法保证变量类型,代码可读性、可维护性差,项目大了、开发人员多了、代码规范没到位的时候,经常让人头疼欲裂。排错成本也高。
[布兰登大哥也是万万没想到没想到,当初自己设计的一款用来提交表单的脚本语言会有如今的规模与地位 ]
- 说完动态说静态,优点:变量与类型强绑定,减少出错率,提高可靠性
- 缺点:被强迫写一堆数据类型代码,加大开发量,且在处理复杂数据时,经常需要定义一个庞大的结构体
弱类型就更好理解了,我优势就是灵活呀,我就是可以'1'=1,我就是可以'1'+1,我就可以隐式转换,你敢说我没底线??你看看编程语言的头,他无类型你怎么说?不就可靠性弱了点吗! 强类型就是强制你赋予类型,说到底就是让开发人员加了一个辅助自己的东西,但我就显得更可靠,额虽然拖了一点开发效率。
重点来了
编译型语言与直译型语言有什么区别呢?
编译型语言: 顾名思义电脑运行他之前,需要先对他进行编译,(比如c++)我们想运行它就需要先通过编译器将他编译成机器码(指令集)文件,然后才能去执行里面的指令,计算机可以直接运行它,所以编译型语言的执行效率是所有语言中最高的;凡事有利必有弊 一般而言,编译型语言的程序开发速度、调试时间都是比较长的,因为他不像解释型语言可以写完一小段马上运行,马上调试;而且他的跨平台性相对较弱,比如c++在linux环境中就需要先安装GCC编译器。
直译型语言: 直译型语言又称解释型语言,它不需要编译,而是先把源码进行编译,翻译成中间代码;再由解释器对中间代码解释运行。
拿JS在V8引擎环境中举例,V8引擎拿到JS文件后,首先会对代码进行 parse(语法分析) 生成抽象语法树(AST),
再由Igniton解释器将AST转换成字节码,同时会收集TurboFan优化所需的信息(例如函数参数的类型), TurboFan是一个编译器,可以把字节码编译成不同环境的机器码;一般情况下,TurboFan将多次使用的代码转换成机器码后,之后用的时候就不需要反复转换了,但也有例外:
上面sum函数被调用三次,前两次是不需要反复转换的,但是第三次调用时,之前转换的机械码是无法执行入参为字符串的sum函数的,这时候就会有另一个操作 deoptimization(反向优化:将机械码又转换回字节码),所以我们多次调用函数时,尽量传入相同类型参数。所以TS在某些角度来讲,确实比JS效率稍微高点。
V8引擎内容较多,感兴趣的同学可以留言,后面会出一章专门介绍V8引擎。
综上所述可以得出:直译型语言每次执行都要进行一次编译,所以运行速度相对会慢很多。但他的优势在于跨平台能力强,利于开发、调试
一套逻辑捋下来,给面试官听懵了,然后这场面试节奏基本就掌握在你手里了,哇哈哈!!!
最后说一句:‘面试就是他哥的玄学,有时候面试感觉特别好,但往往就没下文了;有时候感觉自己拉胯了,结果第二天HR说要给你发offer。’所以面试到底是在面啥呢?谁能告诉我