当前位置: 首页 > 科技观察

JavaScript语言常识-重新学习JavaScript

时间:2023-03-12 10:00:23 科技观察

本次重新学习系列课程假设大家对JavaScript、CSS、HTML有一定的了解。而这个再学习的过程其实是帮助我们在这些过去的知识中建立新的秩序,也就是建立知识体系的过程。在重新学习JavaScript的过程中,我们会以JavaScript的语法为线索,从细到粗地学习JavaScript的语言知识。语言根据语法分类。首先,让我们谈谈常见语言的分类。平时说话的时候,我们说中文。当我们出国留学或旅行时,我们都需要说英语。不知道你有没有这样的经历。我们在国外的时候,因为我们的英语不是很好,我们会把关键词放在一起说这个,然后语法就错了,但是老外都能听懂。比如“Longtimenosee”,我们会说“longtimenosee”,然后老外觉得很好用,就会加到语言里。这类语言的一个特点是它的语法没有严格的定义,所以我们称它为“非正式语言”,典型代表就是我们平时所说的。在计算机中,大多数语言都是“形式语言”——形式语言的特点是有形式定义,非常严密和严密。然后还有正式语言中的分类。在这里我要告诉大家其中之一就是“乔姆斯基谱系”。ChomskyLineage:是计算机科学中描述形式语法表达能力的分类谱系,由NoamChomsky于1956年提出。它包括四个级别。InformallanguageChinese,Englishformallanguage(Chomskypedigree)0-Ty??pe:UnrestrictedGrammar--只要语言定义清楚1-Type:Context-sensitiveGrammar--相同的词句组合,其上下文,语境,和内容相关的2-type:context-freegrammar-相同的表达式,无论放在哪里都具有相同的含义3-type:regulargrammar-可以用正则表达式描述的文法是乔姆斯基谱系中的包含关系0123,也就是说,一个上下文相关文法也一定属于0型,反之则不一定。什么是制作?(BNF)产生:在计算机中,是指Tiger编译器对源程序进行词法分析(LexicalAnalysis)和句法分析(SyntaxAnalysis)后得到的一系列语法规则(Backus-NaurForm,BNF).语句巴科斯范式:巴科斯范式(英语:BackusNormalForm,缩写为BNF)是一种用来表示上下文无关文法的语言,它描述了一类形式化语言。它是一组符号,首先由JohnBackus和PeterNaur引入,用于描述计算机语言的语法。Terminals:最终出现在代码中的字符(https://zh.wikipedia.org/wiki/terminalsandnon-terminals)用尖括号(<,>)表示语法结构的名称语法结构分为需要用其他句法结构定义的基本结构和复合结构基本结构称为终结符复合结构称为非终结符引号和中间的字符表示终结符可以有括号*表示重复多次|表示“或”+表示至少一种情况:我们用BNF来表达大家熟悉的四种算术运算。四种算术运算是:1+2*3这里的总结符号:Number+,-,*,/非终结符MultiplicativeExpressionAdditiveExpression我们小时候学的四种算术运算是加减乘除。其实是有优先级关系的。我们可以理解为1+2x3的连续相加,可以拆分为1和2x3的合成。那么2x3就是它的子结构,然后2和3就是这个结构中的Numbers,运算符*在中间。所以在使用BNF来描述这个远程计算的时候,首先我们要定义一个加法表达式,格式是:乘法表达式列表或者加法表达式+乘法表达式或者加法表达式-乘法表达式因为BNF是可以递归的,所以在定义表达式的时候,你可以使用自己的表达方式。然后乘法类似,只是乘法加法的表达式可以换成Number:Numberormultiplicationexpression*Numberormultiplicationexpression/Number最后看代码怎么写:::=|"*"|"/"|::=|"+"|"-"|深入理解产生式这里我们尝试使用产生式来深入理解上面提到的乔姆斯基谱系。终端:以代码zh.wikipedia.org/wiki/结尾的字符终端和非…0类型:不受限制的语法产品:?::=?无限制文法可以产生多个非终结符所以在无限制文法中可以随便写1-type:上下文相关文法产生式:??::=??生成的写法有一定的限制,可以在?中写多个非终结符。ontheleftandright但是变量只能是front和back,而且是有关联的,而且中间肯定有固定的部分,那么front呢?上面是,后面呢?是下面的2-type:context-freegrammargenerationFormula:::=?左边的必须是非终结符号。右边那个?,::=??常规语法有要求。如果正则语法是递归定义的,那么它不允许你在尾部定义A。如果左边的符号,右边的符号一定出现在产生式的最开始。根据这个规则,所有的正则文法都可以用正则表达式来表示。JavaScript是上下文相关文法、上下文无关文法还是正则无关文法?JavaScript一般是context-free文法,里面的大部分表达式都属于Regular文法,但是有两种特殊情况:1.JavaScript表达式中新增了**运算符,**表示幂运算符其实是右结合的,比如212的结果这里是2,因为先计算1**2,1的2次方是1,然后2的1次方是2,所以最后resultis2insteadof4所以因为是右结合的,所以不是正则文法如果加上这些if判断就不是正则文法。2、比如我们写geta{return1},那么get就类似于一个关键字,但是如果我们在get后面加上:,那么get本身就是属性名,所以如果严格按照Choms根据谱系,那么JavaScript属于上下文相关文法。在JavaScript引擎的实现中,可以理解为大众化的编程结构,针对的是上下文无关文法。一旦遇到像get这样的上下文相关的地方,那么一些特殊情况的处理就会单独用代码来完成。所以一般情况下,JavaScript不属于上下文相关语法来处理。其他产生式除了乔姆斯基谱系可以由BNF定义外,实际上还有许多不同类型的产生式。比如后来出现的EBNF和ABNF,都是在BNF的基础上进行了语法扩展。因此,一般来说,在每一个语言标准中,都会定制一种产生式书写方式。例如在JavaScript中:AdditiveExpression:MultiplicativeExpressionAdditiveExpression+MultiplicativeExpressionAdditiveExpression-MultiplicativeExpression它的开头用缩进表示,相当于产生式左边的非终结符。非终结符后面跟着一个冒号,后面跟着两个空格用于缩进回车。那么在JavaScript标准中,它的非终结符,加号和减号,都是用黑体字来表示终结符。所以网上各种出品,只学一种BNF是不可能看懂所有语言的。虽然它们都有不同的标准和写法,但它们表达的意思大致相同。所以我们需要了解制作背后的思想和原理,然后我们就可以忽略表达上的差异。现代语言的分类在现代语言C++的特例中,*可能表示一个乘号,也可能表示一个指针,这取决于星号前面的标识符是否声明为类型。在VB中,<可能是一个小于号,也可能是一个XML直接变量的开始取决于当前位置是否可以接受XML字面量;在Python中,行首的制表符和空格会根据上一行开头的空格,按照一定的规则处理成虚拟终结符缩进或缩进;在JavaScript中,/可能是除号,也可能是正则表达式的开头。处理方法与VB类似。stringtemplate}中也需要特殊处理,有自动插入分号的规则;语言分类形式化语言——目的数据描述语言——有时我们需要存储一个纯数据,没办法编程JSON,HTML,XAML,SQL,CSS编程语言C,C++,Java,C#,Python,Ruby,Perl,PHP,Go,Perl,Lisp,T-SQL,Clojure,Haskell,JavaScript,CoffeeScriptx形式语言-表达式声明式语言JSON,HTML,XAML,SQL,CSS,Lisp,Clojure,Haskell命令式语言C,C++,Java,C#,Python,Ruby,Perl,JavaScript编程语言的属性图灵完备势在必行-图灵机gotoifandwhiledeclarative-lambdarecursion图灵完备:在可计算性理论中,如果一组规则为操纵数据(如指令集、编程语言、元胞自动机)可以用来模拟单带图灵机,那么它就是图灵完备的。该术语来自数学家艾伦图灵,他提出了图灵机的概念。虽然图灵机会在物理上受到存储容量的限制,但图灵完备性通常是指“具有无限存储容量的通用物理机器或编程语言”。图灵机:又称确定性图灵机,是英国数学家艾伦·图灵于1936年提出的抽象出人类计算行为的数理逻辑机。它更抽象的含义是一种计算模型,可以看作是等效于任何有限逻辑数学过程的终极强大的逻辑机器。DynamicandStaticDynamic:Whenrunningontheuser'sdevice/onlineserver:当产品被实际使用时Term:Runtime(运行时)Static:Whenrunningontheprogrammer'sdevice:WhentheproductdevelopedTerm:Compiletime(编译时)JavaScriptThis一种解释和执行的语言,它没有编译时。我们现在也会使用Webpack来构建我们的代码,但实际上仍然没有Compiletime。所以,Runtime和Compiletime的对应关系在今天已经不准确了,但是我们还是愿意按照Compiletime的习惯,因为JavaScript也是一个“Compiletime(开发中)”的时间,所以我们也会用Compiletime这个词来描述JavaScript里面的一些特性。类型系统动态类型系统-JavaScript是一个动态类型系统,当类型可以在用户的??机器上找到时静态类型系统-只有当程序员编写代码时可以找到的类型C++当代码最终编译到目标机器时,所有类型信息都被丢弃。半动态和半静态类型系统——例如Java等语言提供了反射机制。编译时主要的类型检查和类型操作在编译时已经处理完毕。但是如果你想在运行时获取类型信息,还是可以通过反射获取强类型和弱类型——编程语言中类型转换形式的解释强类型:没有隐式转换(默认情况下不会发生类型转换)弱类型:有隐式转换(JavaScript是典型的弱类型语言,默认把Number转换成String类型,然后加起来给你一个String类型。还有String,Boolean等操作,会把Boolean转换成先Number再和String对比看是否一样)复合类型结构函数签名(包括参数类型和返回值类型两部分)子类型——典型的语言是C++(在做类型转换的时候,会有一些默认behaviors)泛型协方差和逆变:https://jkchao.github.io/typescript-book-chinese/tips/covarianceAndContravariance.html协方差示例:凡是可以使用泛型数组的地方都可以beusedArrayinversionexample:凡是可以使用Function的地方,都可以使用Function。一般来说,我们的命令式编程语言可能会有一些细微的结构上的不一致,但是大体上会分为5种。水平。原子级(Atom)——语言的最小构成单位关键字(Identifier)字符/数字的字面量(Literal)变量名(Variables)表达式(Expression)——原子级结构由运算符连接和辅助符号构成原子单元(Atom)运算符(加、减、乘、除、拼接等。标点符号)语句(Statement)——表达式加上特定的标识符、关键字、符号组成一定的结构表达式(Expression)关键字(Keyword)文法(Punctuator)结构(Structure)——帮助我们组织、分块、划分成不同的复用结构Function(Function)Class(Class)Process(过程)-PASCAL语言会有Process(Namespace)的概念命名空间——C++/PHP会有Namespace的概念程序(Program)—管理语言模块和安装程序(Program)—实际执行的代码模块(Module)——准备复用的模块包(Package)库(Library)d我们将有一个相对固定的结构来解释每个级别。对于每一级,我们都以语法为线索,但实际上,除了语法,我们还关注语义和连续时态。所谓“语义”就是用户实际使用时的样子。前端工程师最关心的是我们写的是什么样的语法,在用户电脑上运行起来是什么样子的。这是我们的转型过程。而中间连接语法运行时正是语言的语义。我们通过一定的语法表达一定的语义,最终改变运行时的状态。作者:三钻链接:https://juejin.im/post/6877043337262694408来源:掘金