Javascript核心读书有感之词法结构


Posted in Javascript onFebruary 01, 2015

编程语言的词法结构是一套基础性的规则,用来描述你如何编写这门语言。作为语法的基础,它规定了变量名是怎么样的,如何写注释,以及语句之间是如何区分的。本节用很短的篇幅来介绍javascript的词法结构。

1.字符集

javascript程序是用Unicode字符集编写的,Unicode是ASCII和Latin-1的超集,并支持地区上几乎所有的语言。ECMAscript3要求javascript的实现必须支持Unicode2,1及后续版本,ECMAscript5则要求支持Unicode3及后续版本

i.区分大小写

javascript是区分大小写的语言,也就是说关键字、变量、函数名和所有的表述字符都必须采用一致的大小写 ,比如关键字while必须写成while,不能写成While或者WHILE。

但需要注意的是html并不区分大小写(尽管xhtml区分),由于它和客户端javascript联系紧密,因此很容易混淆。例如在html设置的处理事件中,onclick属性可以写成onClick,但在javascript中编写写成小写的onclick。

ii空格、换行符、和格式控制器

javascript会忽略程序中的标示(token)之间的空格,多数情况下,javascript同样会忽略换行符。由于可以在代码中随意使用空格和换行符,一次可以采用整齐和一致的缩进来形成统一的编码风格,提高代码的可读性。

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

Unicode格式控制字符(Cf类),比如“从右至左书写标记”(\u200F)和从“从左至右书写标记”(\u200E),控制着文本的视觉显示。这对一些非英语文本的正确显示来说是至关重要的,这些字符可以在javascript的注释,字符串直接量和正则表达式直接量中,但不能用在标示符(比如,变量名)中,但有个例外零宽连接符(\u200D)和零宽非连接符(\uFEFF)是可以出现在标示符中,但不能作为标识符的手字符。上文也提到了,字节序标记格式控制符(\uFEFF)被当成了空格来对待

iii.Unicode转义序列

在有些计算机硬件和软件里,无法显示或输入Unicode字符全集。为了支持哪些使用老旧技术的程序员,javascript定义了一种特殊序列,使用6个ASCII字符来代表任意16位的Unicode内码。这些Unicode转义序列以\u为前缀,其后跟随十六进制鼠(使用数字以及大小写字母A-F表示)。这种Unicode转义写法可以用在javascript字符串直接量、正则表达式之江路和标示符中(关键字除外)。例如字符é的Unicode转义写法为\u00E9,如下两个Javascript字符串完全是一样的。

    "café" === "caf\u00e9" => true
Unicode转义写法可以出现在注释中,但是由于javascript会将注释忽略,他们只是被当成成上下文中的ascii字符处理,并不会接下到对于的Unicode字符

iiii标准化

Unicode允许使用多种方法对同一个字符进行编码。比如字符é可以使用Unicode字符\u00E9,也可以使用普通的ascii字符e跟随一个语调符号\u0301 ,在文本编辑器中,这两个编码显示的结果是一摸一样的,但是它们的二进制编码表示是不一样的,在计算机里也不相等。Unicode标准为索引字符定义了一个首选的代码格式,并给出了一个标准化的处理方式将文本转化为一种适合比较的标准格式,不会再对其它表示、字符串或者正则表达式做标准化处理。

2.注释

javascript支持两种注释方式,在行尾"//"之后的文本都会被javascript当做注释忽略掉的。
此外/*和*/之间的文本也会当做注释。这种注释可以跨行书写,但不能有嵌套注释。

//单行注释
/*
*
*
*
*/
3.直接量

所谓直接量(literal),就是程序中直接使用的数据值,下面列出直接量

        12 //数字

             1.2 //小数

                "Hllo World" //字符串文本

            'hi' //另一个字符串

            true //布尔值

             false //布尔值

                / javascript / gi //正则表达式直接量(用做模式匹配)

             null //空

第3章会详细讲解数字和字符串直接量。正则表达式直接量会在第10章讲解。更多福祉的表达式,可以写成数组或对象直接量。

              {x:1,y:2} //对象
            [1,2,3,4,5] //数组

4.标识符和保留字

标识符就是一个名字。在javascript中,标识符用来对变量和函数进行命名,或者用做javascript代码中某些循环语句中的跳转位置的标记。javascript标识符必须以字母。下划线、或者美元符号开始。后续的字符可以是字母。数字。下划线或者美元符号(数字是不许作为首字母出现的,一遍javascript可以轻易区分开标识符和数字)、下面是合法的标识符

my_variable_name

            b13

            _dummy

            $str

处于可移植性和易于书写的考虑,通常我们只使用只使用ASCII字母和数字来书写标识符。然后需要注意的是,javascript允许标识符中出现Unicode字符全集中的字母和数字(从技术来将ECMAScript允许在标识符的首字符后面出现Unicode字符机制的Mn类,Mc类和P才类)、因此,程序员可以使用非英语的语言或者数学符号来书写标识符

var sá = true;

            var π = 3.14;

javascript把一些标识符拿出来自己用做关键字,因此名就不能再在程序中把这些关键字用做标示符了。

break

case

catch

continue

default

delete

do

else

finally

for

function

if

in

instanceof

new

return

switch

this

throw

try

typeof

var

void

while

with

javascript保留字

class const enum export
export extends import super
另外,这些关键字在普通的javascript中是合法的,但在严格模式下是保留字

implements let private public yield interface package
    protected static
同样严格模式下对下面的标识符做了严格的限制,但不能做变量名、参数名和函数名。

arguments eval
javascript的具体实现可能定义独有的全局变量和函数,每一种特定的javascript运行环境(客户端)服务器等都有自己的一个全局属性列表,这一点是需要牢记的。(window对象来了解客户端javascript中定义全局变量和函数列表)

5.可选的分号

和很多编程语言一样,javascript使用分号(;)将语句分隔开。这对增强代码的可读性和整洁性是非常重要的,缺少分隔符一条语句结束就成了下一条语句的开始,反之亦然。
在javascript中,各自语句独占一行,通常可以省略语句之间的分号(程序结尾处使用“}”花括弧之前的分号也可以省略)。很多javascript程序员(包括本书的代码示例)都是使用分号来明确标记语句的结束,即使在并不完全需要分号的时候也是如此,另一种风格是在任何可以省略分号时都将其省略,只有在不得不使用的时候才使用分号,不管哪种编程风格,关于javascript有几个细节需要注意。
如下代码,第一个分号是可以省略的

a=3;
b=4;
但如果按照如下格式书写,第一个分号则不能省略。

a=3;b=4;
需要注意的是,javascript并不是在所有的换行处都填补分号:只有在缺少了分号就无法正常解析代码的时候,javascript才会填补分号,换句话说(类似下面代码中的两处异常),如果当前的语句和随后的的非空格字符不能当成一个整体解析的话,javascript就在当前语句的结束处来填补分号,看下如下代码

        var a
        a
        =
        3
        console.log(a)
javascript将其解析为

var a;a=3;console.log(a);
javascript给第一行处添加了分号,如果没有分号,javascript就无法解析代码中的var a a。第二个a可以单独当做一条语句“a;”,但javascript没有给第二行结尾处填补分号。因为它可以和第三行内容一起解析成"a=3;" .

有些语句的分隔规则会导致一些想不到的情形,这顿断码分成了两行,看起来是两条独立的语句。

             var y = x + f
            (a+b).toString()
第二行的圆括号却和第一行的f组成了一个函数调用,javascript会把这段代码看做

var y = x+f(a+b).toString();
显然代码的本意不是这样,为了能让上述代码解析成两条不同的语句,必须手动填写行为的显示分号

通常来讲,如果一条语句以 ( [ / + -开始,那么它极有可能和前条语句组合在一起解析,以/ + -开始的语句不很常见,但以( [开始的语句则非常常见。至少在一些javascript编码符风格中是很常见的。有点程序员喜欢保守的在语句前边加上一个分号,这样,哪怕之前的语句被修稿了,分号被误删了,当前语句还是会正确的解析;
如果当前语句和下一行语句无法合并解析。javascript则在第一行后填补分号,这是通用规则,但有两个列外。第一个例外是涉及到returnm,birak,he continue语句,如果这三个关键字后紧跟着换行。javascript则会在换行处填补分号。例如

例如

return
true;
而 javascript解析成

return;ture;
而代码的本意是

    return ture;
也就是说return,break,contuine好的随后的表达式之间不能有换行,如果添加了换行,程序则在极有特殊情况才能报错。而且程序的调试很不方便。

第二个例子是涉及到++ --运算符时,这些表达式符号可以代表标识符表达式的前缀和后缀。如果将其又再后表达式,如果的将其用做后缀表达式。它和表达式应该看做一行。否则行尾将填补分号。

x

++

yy

以上代码解析为

 x;

++y
Javascript 相关文章推荐
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
Dec 25 Javascript
Javascript UrlDecode函数代码
Jan 09 Javascript
javascript 数组学习资料收集
Apr 11 Javascript
JavaScript高级程序设计阅读笔记(六) ECMAScript中的运算符(二)
Feb 27 Javascript
Three.js源码阅读笔记(Object3D类)
Dec 27 Javascript
document.execCommand()的用法小结
Jan 08 Javascript
js中substring和substr两者区别和使用方法
Nov 09 Javascript
详解jQuery中的DOM操作
Dec 23 Javascript
微信小程序 循环及嵌套循环的使用总结
Sep 26 Javascript
将Sublime Text 3 添加到右键中的简单方法
Dec 12 Javascript
基于wordpress的ajax写法详解
Jan 02 Javascript
Vue分页效果与购物车功能
Dec 13 Javascript
Javascript核心读书有感之语言核心
Feb 01 #Javascript
jQuery功能函数详解
Feb 01 #Javascript
jQuery动画与特效详解
Feb 01 #Javascript
jquery制作 随机弹跳的小球特效
Feb 01 #Javascript
jQuery实现单击和鼠标感应事件
Feb 01 #Javascript
jquery制作LED 时钟特效
Feb 01 #Javascript
thinkphp 表名 大小写 窍门
Feb 01 #Javascript
You might like
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
2011/03/19 PHP
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
php中strtotime函数用法详解
2014/11/15 PHP
PHP图像处理类库MagickWand用法实例分析
2015/05/21 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
2019/03/28 PHP
thinkphp整合系列之极验滑动验证码geetest功能
2019/06/18 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
jQuery源码分析之Event事件分析
2010/06/07 Javascript
javascript实现2048游戏示例
2014/05/04 Javascript
JavaScript实现的浮动层框架用法实例分析
2015/10/10 Javascript
[原创]jQuery常用的4种加载方式分析
2016/07/25 Javascript
canvas实现探照灯效果
2017/02/07 Javascript
vue实现验证码按钮倒计时功能
2018/04/10 Javascript
实例讲解JavaScript预编译流程
2019/01/24 Javascript
vue使用nprogress加载路由进度条的方法
2020/06/04 Javascript
Python统计日志中每个IP出现次数的方法
2015/07/06 Python
python的文件操作方法汇总
2017/11/10 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
django中media媒体路径设置的步骤
2019/11/15 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
Carter’s OshKosh加拿大:购买婴幼儿服装和童装
2018/11/27 全球购物
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
医院护士专业个人的求职信
2013/12/09 职场文书
材料员岗位职责
2014/03/13 职场文书
高三学生评语大全
2014/04/25 职场文书
《山谷中的谜底》教学反思
2014/04/26 职场文书
党的生日活动方案
2014/08/15 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
纪委书记群众路线整改措施思想汇报
2014/10/09 职场文书
党员干部作风建设思想汇报范文
2014/10/25 职场文书
外贸英文求职信范文
2015/03/19 职场文书
2015年幼儿园教研活动总结
2015/03/25 职场文书
「租借女友」第2季樱泽墨角色PV&新视觉图公开
2022/03/21 日漫
openGauss数据库JDBC环境连接配置的详细过程(Eclipse)
2022/06/01 Java/Android