ECMAScriptjavascript基础语法——词法结构

面前的话

  javascript是一门简单的言语,也是一门复杂的言语。说它概括,是因为学会使用它只需片刻功力;而说它复杂,是因为要实在精通它则需要数年岁月。实际上,前端工程师很大程度上就是指javascript工程师。前端入门容易了然难,说的是前者,更指的是javascript。本文是javascript基础语法的第一篇——词法结构。词法结构是一套基础性规则,用来讲述咋样利用javascript来编写程序

 

与java关系

  关于javascript有这般一个说法,java和javascript的关联是雷锋和雷锋塔的关联。这究竟有没有关联吧

  javascript最最先的名字是LiveScript,后来挑选javascript作为其标准名称的原委,大概是想让它听起来有系有名门的觉得。除了语法看起来和java类似之外,javascript和java是一点一滴两样的两种编程语言

  程序设计语言分为解释型和编译型两大类。java或C++等语言需要一个编译器。编译器是一种程序,可以把用java等高等语言编写出来的源代码翻译为直接在微机上执行的公文。解释型程序设计语言不需要编译器——它们仅需要解释器,浏览器中的javascript解释器将一贯读入源代码并推行

  java在答辩上几乎可以安排在其他环境,但javascript却倾向于只利用在web浏览器。而且,在javascript语言中,函数是一种独立的数据类型,选拔基于原型对象(prototype)的继承链,javascript语法要比Java自由得多

  基本上,JavaScript这么些名字的本心是“很像Java的脚本语言”

 

定义

  javascript是一门动态的、弱类型的解释型编程语言,分外适合面向对象和函数式的编程风格。javascript的语法源自java,它的一等函数出自scheme,它的依据原型的后续来自self

  javascript用来增强页面动态效果,实现页面与用户之间的实时、动态交互

  javascript由三有的构成:ECMAScript、DOM和BOM

  [1]ECMAScript由ECMA-262定义,提供基本语言成效(ECMA是北美洲统计机创立商社团)

  [2]DOM(Document Object
Model)文档对象模型,提供访问和操作网页内容的法子和接口

  [3]BOM(Browser Object
Model)浏览器对象模型,提供与浏览器交互的主意和接口

ECMAScript 1

 

高低写敏感

  关于javascript这门语言,再怎么强调都不为过的特色是高低写敏感。javascript中的关键字、变量、函数名和兼具的标识符都必须运用一致的大大小小写模式

//'online'、'Online'、'OnLine'、'ONLINE'是四个不同的变量名

  [注意]HTML并不区分轻重缓急写(即使XHTML区分轻重缓急写)。许多客户端javascript对象和总体性与它们表示的HTML标签和性质同名。在HTML中,这一个标签和特性名可以接纳大写也可以使用小写,而在javascript中则必须是小写。例如,在HTML中装置事件处理程序时,onclick属性可以写成onClick,但在javascript代码中,必须使用小写的onclick

 

保留字(ReservedWord)

  和此外任何编程语言同样,javascript保留了一部分标识符为协调所用。这多少个保留字不可以用做通常的标识符。由于不少参考书的误导,貌似保留字和紧要性字是分其余,其实并不是,关键字只是保留字的一部分。保留字包括首要字、未来保留字、空字面量和布尔值字面量

保留字 ReservedWord ::
   Keyword
   FutureReservedWord
   NullLiteral
   BooleanLiteral

关键字

    break      do         instanceof        typeof
    case       else       new               var
    catch      finally    return            void
    continue   for        switch            while
    debugger   function   this              with
    default    if         throw             delete
    in         try

将来保留字

  下列词被当作提议扩大关键字,因而保留,以便将来也许应用这些扩充

    class      enum       extends       super
    const      export     import

ECMAScript3版本

  以上是ECMAScript5的保留字,但在ECMAScript3版本中的保留字并不均等,若希望代码能在基于ECMAScript3实现的解释器上运行以来,应该避免接纳以下保留字作为标识符

abstract boolean byte char class constdouble enum export extends final float
goto implements import int interfacelong native package private protected
public short  static super synchronized throw transient volatile 

预定义变量和函数

  此外,javascript预定义了成千上万全局变量和函数,应该防止把它们的名字用做标识符名

arguments Array Boolean Date decodeURI decodeURIComponent encodeURI
encodeURIComponent Error eval EvalError Function Infinity isFinite
isNaN JSON Math NaN Number Object parseFloat parseInt RangeError
ReferenceError RegExp String SyntaxError TypeError undefined URIError

 

注释(Comment)

  不是所有语句都急需javascript解释器去解释并施行。有时需要在本子中写一些仅供自己参考或提醒自己的音讯,并期望javascript解释器能从来忽略掉这个信息,这类信息就是注释

  注释能使得救助精通代码流程,在代码中它们扮演生活中便条的角色,能够扶助大家弄了解脚本到底干了什么

  [注意]注明一定要准确地讲述代码,没有用的声明比一向不注释还要不佳

  有多种形式得以在javascript脚本中插入注释,包括单行注释、多行注释和HTML风格的笺注

【1】单行注释以六个斜杠起初

//单行注释

【2】多行注释又叫块级注释,以一个斜杠和一个星号/*起头,以一个星号和一个斜杠*/结尾

/*
    这是一个多行注释
 */

  [注意]块级注释/**/可以跨石籀文写,但不可以嵌套,否则会报错

//报错
/*
注释1
/*
注释1.1
 */
 */

  [注意]块级注释/**/中的这多少个字符也恐怕出现在正则表明式字面量里,所以块级注释对于被诠释的代码块来说是不安全的

/*
    var rm_a = /a*/.match(s);
*/

【3】HTML风格的笺注仅仅适用于单行注释,其实javascript解释器对<!–的拍卖和对//的拍卖是同一的

<!-- 这是javascript中的注释

  假诺在HTML文档中,还索要以–>来终结注释

<!-- 这是HTML中的注释 -->

  但javascript不要求这么做,它会把–>视为注释内容的一局部

  [注意]HTML允许地点这样的笺注跨越多行,但这种注释的每行都必须在起初加上”<!–“来作为标志

<!-- 我是注释1
<!-- 我是注释2
<!-- 我是注释3

  因为javascript解释器在拍卖这种作风的笺注时与HTML做法不一,为制止发生混淆,最好不用在javascript脚本中行使HTML风格的诠释

 

空白(WhiteSpace)

  空白平时没有意义,有时候必须要用它来分隔字符系列,否则它们就会被联合成一个标志

var that = this;

  var和that之间的空域是无法移除的,但另外的空域可以移除

  javascript会忽略程序中标识(token)之间的空格。多数气象下,javascript同样会忽视换行符。由于可以在代码中随意动用空格和换行,因而可以运用整齐、一致的缩进来形成统一的编码风格,从而提升代码的可读性

//通过增加空白字符,提高代码可读性
for(var i = 1; i < 10; i++){
    //
}

  javascript将如下那一个分辨为空白字符惠特(Whit)eSpace

\u0009    水平制表符         <TAB>
\u000B    垂直制表符         <VT>
\u000C    换页符            <FF>
\u0020    空格符            <SP>
\u00A0    非中断空格符       <NBSP>
\uFEFF    字符序标记

  javascript将如下字符识别为行终止符LineTerminator

\u000A    换行符        <LF>
\u000D    回车符        <CR>
\u2028    行分隔符      <LS>
\u2029    段落分割符     <PS>

 

可选的子公司

  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);

  这种话语的相间规则会促成一些意想不到的图景

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

  javascript将其分析为:

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

  因而,为了能让上述代码解析成两条不同的话语,必须手动填写行尾的显式分号

  通常来讲,如果一条语句以'(‘、'[‘、’/’、’+’、’-‘等标志起首,那么它极有可能和前一条语句合一起分析

多少个不等

  如果当前讲话和下一行语句不能统一解析,javascript会在率先行后补偿分号,这是通用规则,但有四个不同

  【1】第一个不同是关乎return、break、continue、throw语句的场馆中。如果这四个第一字后跟随换行,javascript会在换行处填补分号

return
true;

  javascript将其分析为:

return;true;

  而代码的原意是:

return true;

  【2】第二个不同是在涉及++和–运算符时,倘若将其当作后缀表达式,它和表明式应该同一行。否则,行尾将补充分号,同时++或–将用作下一行代码的前缀操作符并与之一起分析

x
++
y

  javascript将其分析为:

x;++y;

  而代码的本意是:

x++;y;

  尽管分号不是必须的,但极致不要简单它,因为增长分号可以避免过多不当,代码行结尾处没有分号会招致缩小错误。加上分号也会在好几情形下增强代码的性质,因为这样解析器就不必再花时间测算应该在什么地方插入分号了

 

参考资料

【1】 ES5/词法 https://www.w3.org/html/ig/zh/wiki/ES5/lexical
【2】 阮一峰Javascript标准参照教程——语法概述
http://javascript.ruanyifeng.com/grammar/basic.html
【3】 W3School-Javascript高级教程——ECMAScript语法
http://www.w3school.com.cn/js/pro\_js\_syntax.asp
【4】《javascript权威指南(第6版)》第2章 词法结构
【5】《javascript高级程序设计(第3版)》第3章 基本概念
【6】《javascript语言漂亮(修订版)》第2章 语法
【7】《javascript DOM编程艺术(第2版)》第2章 Javascript语法