【词法结构】字符集、注释、直接量、标识符和保留字、可选的分号

【字符集】

JavaScript程序是用Unicode字符集编写的。

Unicode是ASCII和Latin-1的超集,支持地球上几乎所有在用的语言。

ECMAScript 3 要求JavaScript的实现必须支持Unicode 2.1 及后续版本,
ECMAScript 5 则要求支持Unicode 3及后续版本。

1. 区分大小写

JavaScript是区分大小写的语言。关键字、变量、函数名和所有的标识符都必须采取一致的大小写形式。

HTML不区分大小写,XHTML区分大小写。
许多客户端JavaScript对象和属性与它们所表示的HTML标签和属性同名。在HTML中,
这些标签和属性名可使用大写也可使用小写,在JavaScript中则必须是小写

例子:在HTML中设置事件处理程序时,onclick属性可以写成onClick,但在JavaScript代码(或者XHTML文档)中,必须使用小写的onclick。

2. 空格、换行符、格式控制符

JavaScript会忽略程序中标识之间的空格,多数情况下,也会忽略换行符。

由于可在代码中随意使用空格和换行,因此也采用整齐、一致的缩进来形成统一的编码风格,从而提高代码的可读性。

除了可识别普通的空格符(\u0020),JavaScript还可识别一些表示空格的字符:
水平制表符(\u0009)、垂直制表符(\u000B)、换页符(\u000C)、不中断空白(\u00A0)、字节序标记(\uFEFF),以及在Unicode中所有Zs类别的字符。
JavaScript将如下字符识别为行结束符:换行符(\u000A)、回车符(\u000D)、行分隔符(\u2028),段分隔符(\u2029)。
回车符加换行符在一起被解析为一个单行结束符。

Unicode格式控制字符(Cf类),比如*从右至左书写标记*(\u200F),*从左至右书写标记*(\u200E),控制着文本的视觉显示,这对一些非英语文本的正确显示来说至关重要。

这些字符可用在JavaScript的注释、字符串直接量和正则表达式直接量中,但不能用在标识符(比如变量名)中,但有个例外,零宽连接符(\u200D)和非零宽连接符(\uFEFF)可出现在标识符中,但不能作为标识符的首字符。

 3.Unicode转义序列

在有些计算机硬件和软件里,无法显示或输入Unicode字符全集。

为了支持那些使用老旧技术的程序员,JavaScript定义了一种特殊序列,使用6个ASCII字符来代表任意16位Unicode内码。

这些Unicode转义序列均以\u为前缀,其后跟随4个十六进制数(使用数字及大写或小写的字母A~F表示)。

这种Unicode转义写法可用在JavaScript字符串直接量、正则表达式直接量和标识符中(关键字除外)。

"café" === "caf\u00e9" // => true

Unicode转义写法也可出现在注释中

4.标准化

Unicode允许使用多种方法对同一个字符进行编码。

Unicode标准为所有字符定义了一个首选的编码格式,并给出了一个标准化的处理方式将文本转化为一种适合比较的标准格式,JavaScript会认为它正在解析的程序代码已经是这种标准格式,不会再对其标识符、字符串或正则表达式作标准化处理。

【注释】

合法的JavaScript注释:

//这是单行注释

/*这是一段注释*/ //这是另一段注释

/*
*这有是一段注释
*这里的注释可连写多行
*/

【直接量】

直接量(literal):程序中直接使用的数据值。

例子:
12 // 数字
1.2 // 小数
"hello world" // 字符串文本
"Hi" // 另一个字符串
true // 布尔值
false // 另一个布尔值
/javascript/gi // 正则表达式直接量(用做模式匹配)
null // 空
{ x:1 , y:2 } // 对象
[ 1,2,3,4,5,6 ] // 数组

【标识符和保留字】

1. 

标识符就是一个名字。在JavaScript中,标识符用来对变量和函数进行命名,或用做JavaScript代码中某些循环语句中的跳转位置的标记。

标识符必须以字母、下划线_或美元符$开始。
数字不允许作为首字符出现。

出于可移植性和易于书写的考虑,通常只使用ASCII字母和数字来书写标识符。

然而需注意,JavaScript允许在标识符中出现Unicode字符全集中的字母和数字。(从技术上讲,ECMAScript标准也允许在标识符的首字符后面出现Unicode字符集中的Mn类、Mc类和Pc类)。

由此,程序员也可使用非英语语言或数学符号来书写标识符。

JavaScript保留了一些标识符为自己所用。这些“保留字”不能用做普通的标识符。

2.
JavaScript把一些标识符拿出来用做自己的关键字。因此,不能在程序中把这些关键字用做标识符(不能用作 变量名/函数名,或某些循环语句中跳转位置的标记):
break、delete、function、return、typeof、case、do、if、switch、var、catch、else、in、this、void、continue、false、instanceof、throw、while、debugger、finally、new、true、with、default、for、null、try

JavaScript同样保留了一些关键字,在当前的语言版本中并没有使用,但在未来版本中可能会用到。ECMAScript 5保留了这些关键字:
class、const、enum、export、extends、import、super

有些关键字在普通的JavaScript代码中是合法的,但在严格模式下是保留字:
implements、let、private、public、yield、interface、package、protected、static

严格模式下,对下面标识符的使用做了严格限制,不能用做变量名、函数名或参数名:
arguments、eval

ECMAScript 3 将Java的所有关键字都列为自己的保留字,尽管这些保留字在ECMAScript 5 中放宽了限制,但如果希望代码能在基于ECMASscript 3 实现的解释器上运行的话,应避免使用下面这些关键字作为标识符:
abstract、double、goto、native、static、boolean、enum、implements、package、super、byte、export、import、private、synchronized、char、extends、int、protected、throws、class、final、interface、public、transient、const、float、long、short、volatile

JavaScript预定义了很多全局变量和函数,应当避免把它们的名字用做变量名和函数名:
arguments、encodeURI、Infinity、Number、RegExp、Array、encodeURIComponent、isFinite、Object、String、Boolean、Error、isNaN、parseFloat、SyntaxError、Date、eval、JSON、parseInt、TypeError、decodeURI、EvalError、Math、RangeError、undefined、decodeURIComponent、Function、NaN、ReferenceError、URIError

JavaScript的具体实现可能定义独有的全局变量和函数,每一种特定的JavaScript运行环境(客户端、服务器端等)都有自己的一个全局属性列表。

【可选的分号】

JavaScript使用分号(;)将语句分隔开。这对增强代码的可读性和整洁性非常重要。

关于JavaScript中可选分号的问题有些需要注意的细节:

a = 3;
b = 4;
两条语句用两行书写,第一个分号是可省略掉的

a = 3; b = 4;
这样格式的书写,第一个分号不能省略掉

JavaScript并不是在所有换行处都填补分号:只有在缺少了分号就无法正确解析代码的时候,JavaScript才会填补分号。

如果当前语句和随后的非空字符不能当成一个整体来解析的话,JavaScript就在当前语句行结束处填补分号。

JavaScript无法解析代码var a a ; 第二个a可和第三行内容一起解析成“a=3;”

var y = x + f
(a+b).toString( )

JavaScript会把这段代码看做:var y = x + f(a+b).toString( ); 而这段代码本意并不是这样。

通常来讲,如果一条语句以“(”、“[”、“/”、“+”、“-”开始,那么它极有可能和前一条语句在一起解析。
有些程序员喜欢保守地在语句前加上一个分号,这样如果之前的语句被修改了、分号被误删除了,当前语句还是会正确得解析:
var x = 0 // 这里省略了分号
;[x,x+1,x+2].forEach(console.log) // 前面的分号保证了正确的语句解析。

如果当前语句和下一行语句无法合并解析,JavaScript则在第一行后填补分号,这是通用规则,但有两个例外:

1.在涉及return、break和continue语句的场景中。如果这三个关键字后紧跟着换行,JavaScript则会在换行处填补分号。

即:在return、break、continue和随后的表达式之间不能有换行。
如果添加了换行,程序只有在极特殊的情况下才会报错,且程序的调试也非常不方便

2.在涉及“++”和“--”运算符时。这些运算符可作为表达式的前缀,也可当做表达式的后缀。
如果将其用做后缀表达式,它和表达式应当在同一行。否则,行尾将填补分号,同时“++”或“--”将会作为下一行代码的前缀操作符并与之一起解析:

后续待了解/研究(解决): ASCII,Latin-1,Unicode格式控制字符(Cf类),Unicode字符集中的Mn类、Mc类和Pc类……

扩展阅读:《Unicode与JavaScript详解》 阮一峰

笔记《JavaScript 权威指南》(第6版) 分条知识点概要1—词法结构的更多相关文章

  1. Note | javascript权威指南[第六版] 第2章:词法结构

      语法结构规定了诸如变量名是什么样的.怎么写注释,以及程序语句之间如何分隔等规则.本章用很短的篇幅来介绍JavaScript的词法结构.   2.1.字符集   JavaScript程序是用Unic ...

  2. 《JavaScript权威指南 第六版 中文版》(一)

    <JavaScript权威指南 第六版 中文版> 第二章 词法结构 2.1字符集 JavaScript是使用Unicode字符集编码写的. 2.1.1区分大小写 JavaScript是区分 ...

  3. javascript权威指南第6版学习笔记

    javascript权威指南第6版学习笔记 javascript数组.函数是特殊对象 看一点少一点. 3.1.4 hello.js内容是 var x=.3-.2;var y=.2-.1 console ...

  4. JavaScript权威指南(第6版)(中文版)笔记

      JavaScript权威指南(第6版)(中文版)笔记      

  5. 《JavaScript权威指南(第6版)(中文版)》PDF

    简介自1996年以来,JavaScript的:权威指南已为JavaScript圣经程序员,程序员指南和全面的参考,以核心语言和客户端JavaScript API的Web浏览器定义.第6版包括HTML5 ...

  6. 【JavaScript权威指南(第五版)】笔记之第一部分 核心javascript (第1章~第12章)

    第一章 javascript概述 ①.javascript是一种松散类型语言;也是一种解释型语言;         第二章 词法结构 ①.大小写敏感         第三章 数据类型和值 ①.isFi ...

  7. JS 语言核心(JavaScript权威指南第六版)(阅读笔记)

    前言: 对于程序员,学习是无止境的,知识淘换非常快,能够快速稳固掌握一门新技术,是一个程序员应该具备的素质.这里将分享本人一点点不成熟的心得. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思 ...

  8. JavaScript权威指南第六版(阅读笔记)

    前言: 对于软件行业学习是无止境的,因为知识更替非常快,能够快速稳固掌握一门新技术是一个程序员应该具备的基本素质. 了解一门语言,了解它的概念非常重要,但是一些优秀的设计思想需要细心和大量实践才能慢慢 ...

  9. [在读] javascript权威指南第六版

    耽搁了有大半年没看,记得当时看到5分之2了吧.权威指南是不管读几遍都能觉得有新收获的书^^

随机推荐

  1. MVC-Razor视图

    Razor 视图引擎 与Aspx开发区别在于代码: 1.Razor 更智能,摒弃了<%%>格式,直接用@符号开启cs代码,遇到html时自动识别 2.遇到如汉字等即非cs代码,又非html ...

  2. POSIX

    API: POSIX (编译前的源代码) ABI: APPLICATION BINARY INTERFACE (编译后的二进制文件,linux & windows不兼容) ---------- ...

  3. 在windows+eclipse+git遇到的未修改文件被标记为已修改的问题

    最近遇到2个具体的问题: 1.我们有个工程里面有几个外部jar包,这几个jar包经常会更新,更新的时候如果是在eclipse中执行的,由于windows文件机制,所以会报错无法覆盖这几个jar包.虽然 ...

  4. CCF CSP 201812-1 小明上学

    题目链接:http://118.190.20.162/view.page?gpid=T80 问题描述 试题编号: 201812-1 试题名称: 小明上学 时间限制: 1.0s 内存限制: 512.0M ...

  5. JavaScript--图片放大镜

    图片放大镜的原理: 两张相同的图片img1和img2,img1上有一个#dd的div,通过鼠标移动dd,根据dd区域内的图片,来裁剪img2的图片,并将img2的图片放大,显示出来 关键词:img1坐 ...

  6. DB2数据库常用的函数

    1.value函数 语法value(表达式1,表达式2)value函数是用返回一个非空的值,当其第一个参数非空,直接返回该参数的值,如果第一个参数为空,则返回第一个参数的值. eg:表示如果T1.ID ...

  7. docker介绍

    一.docker的定义 docker是一个平台,开发人员进行docker应用的开发和系统管理人员对docker应用部署和管理. 二.docker与Virtual Machine的区别 三.docker ...

  8. 前端框架bootstrap(响应式布局)入门

    Bootstrap,是基于HTML,CSS.javascript的前端框架 该框架已经预定义了一套CSS样式和与样式相对应的js代码(对应的样式有对应的特效.) 开发人员只需要编写HTML结构,添加b ...

  9. Oracle错误——ORA-39000:转储文件说明错误、ORA-39001:参数值无效、ORA-39088:文件名不能包含路径说明

    错误 在使用数据泵导入文件时,报错如下 Next 出错原因 在使用参数DUMPFILE指定文件名称时,不能包含路径信息,只可以使用文件名称 Next 解决办法 在使用数据泵进行数据导入导出前,必须要创 ...

  10. oracle 增加大字段项

    --不同类型增加大字段项 alter table 表名 add 新增一个字段B clob; --将需要改成大字段的项内容copy到大字段中 update 表名 set 新增一个字段B=字段A; --将 ...