前端进阶笔记(一)---JS语言通识
一、语言按照语法分类
1、非形式语言:中文 英文
2、形式语言:乔姆斯基谱系(四种文法 上下文包含文法)
- 0型 无限制文法
- 1型 上下文相关文法
- 2型 上下文无关文法
- 正则文法
二 产生式(BNF)
巴科斯诺尔范式:即巴科斯范式(英语:Backus Normal Form,缩写为 BNF)是一种用于表示上下文无关文法(2型)的语言,上下文无关文法描述了一类形式语言。它是由约翰·巴科斯(John Backus)和彼得·诺尔(Peter Naur)首先引入的用来描述计算机语言语法的符号集。
产生式: 在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句
用尖括号括起来的名称来表示语法结构名
语法结构分成基础机构和需要用其他语法结构定义的复合结构
- 基础结构终结符
- 复合结构非终结符
- 引号和中间的字符表示终结符
可以有括号
*表示重复多次
| 表示或
+表示至少一次
终结符:
- Number
- + - * /
非终结符
- MultiplicativeExpression
- AdditiveExpression
BNF 表示的四则运算 加减 乘除
定义一个数字
<Number> = "0" | "1" | "2" .....| "9"
定义一个十进制数
<DecimalNumber> = "0" | (("1" | "2" .....| "9") <Number>* )
加法
<AdditiveExpression> ::= <DecimalNumber> + <DecimalNumber>
<MultiplicativeExpression> :: = <DecimalNumber> | <MultiplicativeExpression> "*" <DecimalNumber> | <MultiplicativeExpression> / <DecimalNumber>
<AdditiveExpression> ::= <MultiplicativeExpression> | <AdditiveExpression> "+" <MultiplicativeExpression> | <AdditiveExpression> "/" <MultiplicativeExpression>
BNF 带括号的四则运算
括号
<PrimaryExpression> = <DecimalNumber> | "(" <LogicalExpress> ")"
+ -
<AdditiveExpression> = <PrimaryExpression> | <AdditiveExpression> "+" <PrimaryExpression> | <AdditiveExpression> "-" <PrimaryExpression>
* /
<MultiplicativeExpression> = <DecimalNumber> | <MultiplicativeExpression> "*" <DecimalNumber> |<MultiplicativeExpression> "/" <DecimalNumber>
四则表达式
<LogicalExpress> = <DecimalNumber> | <LogicalExpress> "||" <AdditiveExpression> | <LogicalExpress> "&&" <AdditiveExpression>
产生式: 在计算机中指 Tiger 编译器将源程序经过词法分析(Lexical Analysis)和语法分析(Syntax Analysis)后得到的一系列符合文法规则(Backus-Naur Form,BNF)的语句
通过产生式理解乔姆斯基谱系
- 0型无限制文法
- ?:: =? <a> <b> ::= "c" <d>
- 1型上下文相关法 VB JavaScript Python
- ?<A> ?::=? <B> ? <a> <b> <c> ::= <a> "c" <b> 只有中间那个可以变
"'''四则运算\n" <LogicalExpress> "'''" = "'''四则运算" ( <LogicalExpress> = <DecimalNumber> | <LogicalExpress> "||" <AdditiveExpression> | <LogicalExpress> "&&" <AdditiveExpression>) "'''"
- 2型上下文无关法
- <A>::=?
- 3型正则文法(表达式)
- <A>::=<A>?
- <A>::=?<A> 不正确
JavaScript 总体上属于上下文无关文法 表达式大部分属于正则文法,有两个特例 **(乘方) 是右结合 不属于正则 属于2型
{
get a{ return1},
get:1
}
属于1型文法
三、现代语言的特例
- C++中,*可能表示乘号或者指针,具体是哪个,取决星号前面的标示符是否被声明为类型
- VB中,<可能是小于号,也可能是XML直接量的开始,取决于当前位置是否可以接受XML直接量
- Python中,行首的Tab符和空格会根据上一行的行首空白以一定的规则被处理成虚拟终结符indent或者dedent
- JavaScript中,/可能是除号,也可能是正则表达式的开头,除理方式类似于VB,字符串模板中也需要特殊处理},还有自动插入分号
四、编程语言的分类
- 形式语言-用途
- 数据描述语言 JSON 、HTML、XAML、SQL、CSS
- 编程语言: C++、C、Java、C#、Python、Ruby、Perl、Lisp、T-SQL、Clojure、Haskel、JavaScript
- 形式语言-表达方式
- 声明式语言 JSON 、HTML、XAML、SQL、CSS 、Lisp、Clojure、Haskel
- 命令型语言: C++、C、Java、C#、Python、Ruby、Perl、T-SQL、JavaScript
五、编程语言的性质
图灵完备性
- 命令式 -图灵机
- goto
- if和while
- 声明式 -lambda
- 递归
- 命令式 -图灵机
动态与静态
动态:
- 在用户的设备/在线上服务器上
- 产品运行时
- Runtime
静态
- 在程序员的设备上
- 产品开发时
- Compiletime
类型系统
- 动态类型系统与静态类型系统
- 动态类型系统(JavaScript)
- 静态类型系统 C++
- 强类型与弱类型
- String + Number
- String == Boolean
- 复合类型
- 结构体{ a:t1,b:t2}
- 函数签名 参数类型(列表)和返回值类型 (T1,T2)=>T3
- 子类型
- 动态类型系统与静态类型系统
- 凡是能用Array<Parent> 的地方都能用Array<Child> (协变)
- 凡是能用Funtion<Child> 的地方都能用Funtion<Parent> (逆变)
泛型 逆变与协变
一般命令式编程语言的设计方式
Atom(原子级) 最小的组成单位 通常包含关键字 直接量 变量名一些基本的单位称为原子
- Indetifier 变量名
- Literal 直接量 数字直接量和字符串直接量
Expression(表达式) 原子级的结构通过运算符相连接,加上一些辅助的符号,构成表达式,通常是一个可以级联的结构
- Atom 原子
- Operator 运算符 (javascript为例)
- 算数运算符 + - * / % ++ --
- 赋值运算符 = += -+ *= /= %=
- 比较运算符 == === != !== > < >= <= ?
- 逻辑运算符 && || !
- 类型运算符 typeof(返回变量的类型) instanceof(返回 true,如果对象是对象类型的实例。)
- 位运算符 & | ~(非) ^(异或) <<(零填充左位移) >>(有符号右位移) >>> (零填充右位移)
- Punctuator 特定的符号
Statement语句 if while for 语句
- Expression
- Keyworld
- Punctuator
Structure结构化
- Function
- Class
- Process 线程
- Namespace (c++)
Program工程 npm
- Promgram
- Module
- Package
- Library
前端进阶笔记(一)---JS语言通识的更多相关文章
- 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?
目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...
- 进阶笔记(1)——JavaScript 语言精碎
调用:(调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数) 每个函数接受连个附加参数:this (取决于调用的模式).argument. js的四种调用模式及this指向: 1.方法调用:( ...
- 进阶笔记(2)——JavaScript语言精碎
正则 / 正则表达式 / ^ 表示字符串开始 (?:...) 表示一个非捕获型分组(没多大意义) 后缀 ? 表示匹配 0 或 1次 ( ... ) 表示捕获型 ...
- 2. web前端开发分享-css,js进阶篇
一,css进阶篇: 等css哪些事儿看了两三遍之后,需要对看过的知识综合应用,这时候需要大量的实践经验, 简单的想法:把qq首页全屏另存为jpg然后通过ps工具切图结合css转换成html,有无从下手 ...
- 前端进阶(12) - css 的弱化与 js 的强化
css 的弱化与 js 的强化 web 的三要素 html, css, js 在前端组件化的过程中,比如 react.vue 等组件化框架的运用,使 html 的弱化与 js 的强化 成为了一种趋势, ...
- JS 语言核心(JavaScript权威指南第六版)(阅读笔记)
前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思 ...
- 【前端】Web前端学习笔记【1】
... [2015.12.02-2016.02.22]期间的学习笔记. 相关博客: Web前端学习笔记[2] 1. JS中的: (1)continue 语句 (带有或不带标签引用)只能用在循环中. ( ...
- 1. web前端开发分享-css,js入门篇
关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人与人的教育背景与成长环境心理活动都有差别,但就别人的心得再结合自己的特点,然后探索适合自己的学 ...
- web前端开发分享-css,js入门篇(转)
转自:http://www.cnblogs.com/jikey/p/3600308.html 关注前端这么多年,没有大的成就,就入门期间积累了不少技巧与心得,跟大家分享一下,不一定都适合每个人,毕竟人 ...
随机推荐
- windows server2012在已有.net4.5框架的基础上安装.net3.5的方法
我们在一台服务器运行各种程序的时候难免会用到一些好用的但是很老的软件.老软件也就难免需要以前的那种环境来运行,但是老的环境与新的环境往往不兼容.下面我就来讲一讲系统在已有.net4.5的情况下怎么安装 ...
- Windows下mysql的基础操作
1.数据库表操作: - 首先启动mysql服务器,在安装mysql的目录下打开cmd窗口,运行mysql:'mysql.exe -hlocalhost -p3306 -uroot -p123456'; ...
- 内存管理,goto的使用,内存的申请和释放,mmap,ioremap
1.内存管理 (将物理内存映射到内核空间(3G~4G)并使用) 深入内核: 伙伴系统 1.1基本概念 1)linux内核管理内存是以物理内存页为单位 一个物理内存页通常为4KB ...
- Linux dd工具磁盘读写测试分析
话说,Linux 自带的dd工具测试硬盘读写速度只能提供一个大概的测试结果,而且是连续IO 而不是随机IO ,理论上文件规模越大,测试结果越准确.理论上bs越大,所测得性能越高. 上句来自网上,是不是 ...
- Linux防火墙iptables详解
iptables详解(思维导图) 1. 概述 1.1 iptable简介 1.2 防火墙的种类 1.3 netfilter 2. iptables的工作流程 2.1 iptables工作图示 2.2 ...
- CDN百科第四讲 | 如何优雅地在云上“摆摊”——做直播带货,你不得不关注的技术
最近,国家政策开始鼓励“地摊经济”,一时间各家企业平台纷纷推出地摊扶持政策,地摊概念股顺势大涨,地摊生态及配套商品也开始走俏,甚至在网络上也涌现出各种“新摊主速成攻略”,万亿的烟火经济俨然已经走上风口 ...
- RocksDB事务的隔离性分析【原创】
Rocksdb事务隔离性指的是多线程并发事务使用时候,事务与事务之间的隔离性,通过加锁机制来实现,本文重点剖析Read Commited隔离级别下,Rocksdb的加锁机制. Rocksdb事务相关类 ...
- 【转】Windows下PATH等环境变量详解
[转]“肖凡的专栏” 博客,请务必保留此出处http://legend2011.blog.51cto.com/3018495/553255 在学习JAVA的过程中,涉及到多个环境变量(environm ...
- Spring Boot]SpringBoot四大神器之Actuator
论文转载自博客: https://blog.csdn.net/Dreamhai/article/details/81077903 https://bigjar.github.io/2018/08/19 ...
- 服务扫描-dmitry、nmap、amap和服务识别
dmitry使用-pb参数可以进行常用端口的banner抓取. 抓取效果: 强大的nmap也可以进行banner抓取,但是需要使用nmap内置的banner.nse脚本: kali中还有一个工具叫am ...