JavaScript语言核心之词法结构

  编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序。作为语法的基础,它规定了诸如变量名是什么样的、怎么写注释,以及程序语句之间如何分割的等规则。

  1.1字符集

  JavaScript程序是用Unicode字符集编写的。至于Unicode字符集,目前虽然查过一些资料,但是至今对UTF-8、UTF-16还是晕菜,也没搞懂一个汉字到底占几个字节的问题,所以这里就不做介绍了(就当埋坑了,以后搞懂了再做介绍吧)。至于计算js中一个字符串所在字节数,曾查到如下实现代码:

 1 /**
 2  * 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16
 3  * UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码
 4  * 
 5  * 000000 - 00007F(128个代码)      0zzzzzzz(00-7F)                             一个字节
 6  * 000080 - 0007FF(1920个代码)     110yyyyy(C0-DF) 10zzzzzz(80-BF)             两个字节
 7  * 000800 - 00D7FF 
 8    00E000 - 00FFFF(61440个代码)    1110xxxx(E0-EF) 10yyyyyy 10zzzzzz           三个字节
 9  * 010000 - 10FFFF(1048576个代码)  11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz  四个字节
10  * 
11  * 注: Unicode在范围 D800-DFFF 中不存在任何字符
12  * {@link http://zh.wikipedia.org/wiki/UTF-8}
13  * 
14  * UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节
15  * 000000 - 00FFFF  两个字节
16  * 010000 - 10FFFF  四个字节
17  * 
18  * {@link http://zh.wikipedia.org/wiki/UTF-16}
19  * @param  {String} str 
20  * @param  {String} charset utf-8, utf-16
21  * @return {Number}
22  */
23 var sizeof = function(str, charset){
24     var total = 0,
25         charCode,
26         i,
27         len;
28     charset = charset ? charset.toLowerCase() : '';
29     if(charset === 'utf-16' || charset === 'utf16'){
30         for(i = 0, len = str.length; i < len; i++){
31             charCode = str.charCodeAt(i);
32             if(charCode <= 0xffff){
33                 total += 2;
34             }else{
35                 total += 4;
36             }
37         }
38     }else{
39         for(i = 0, len = str.length; i < len; i++){
40             charCode = str.charCodeAt(i);
41             if(charCode <= 0x007f) {
42                 total += 1;
43             }else if(charCode <= 0x07ff){
44                 total += 2;
45             }else if(charCode <= 0xffff){
46                 total += 3;
47             }else{
48                 total += 4;
49             }
50         }
51     }
52     return total;
53 }

  此代码来自:http://www.alloyteam.com/2013/12/js-calculate-the-number-of-bytes-occupied-by-a-string/

  1.1.1 区分大小写

  JavaScript是区分大小写的语言。注意:HTML并不区分大小写,在HTML中设置时间处理程序时,onclick属性可以设置成onClick,但在JavaScript代码中,必须使用小写的onclick。

  1.1.2 关于注释

  JavaScript支持两种注释。第一种:单行注释"//";第二种:多行注释"/* ... */"。注意:多行注释/* ... */中不能再嵌套/* ... */。

  1.1.3 神奇的分号

  JavaScript中的语句没有强制性的要求使用分号(;)将语句分隔开。在没有写分号时,其解析规则如下:如果当前语句和下一行语句无法合并解析,则在第一行后填补分号。有两个例外情况:①在涉及return、break和continue语句时,如果在三个关键字后紧跟换行,JavaScript则会在换行处填补分号;例如:

 

return
true

 

  上面代码将解析为“return;true”而不是“return true;”。

 

②在涉及”++“和”--“运算符时,如果要将其用做后缀表达式,它和表达式应在一行。否则,"++"和”--“将会作为下一行代码的前缀操作符并与之一起解析。例如:

  

x
++
y

 

  上面的代码将会解析为"x;++y;",而不是"x++;y;"。

③有时候为了可读性较高,我们可能不把一个字符串的内容放在同一行(特别是使用js向HTML页面添加一长段HTML代码时),这时该怎么办呢?没错,就是它——反斜杠\,例如:

var h1_con = "\
                          <div class='h1_div'>\
                               <h1>我是h1</h1>\
                          </div>\
";     
document.write(h1_con);   

  

  1.1.4 标识符命名规则

  以字母、下划线、美元符($)开始,后续可以使字母、数字、下划线、美元符(不允许数字作为首字符以便JavaScript可以轻易的区分开标识符和数字)(至于在JS中一个标识符的字符数量是否有上限?记得以前学习C语言时看的书上说的是标识符最多32个字符,不过在下在Chrome、IE、FF中测试了几百个字符的标识符都是可以正常使用的,也没有在什么文档上见到过规定标识符字符数量上限的,个人推测应该没有设置上限吧)。

  1.1.5 关键字与保留字

  ①关键字(29个)

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

 

  

 

 

  ②保留字(7个)

  class  const  enum  extends  import  super

  ③保留字,严格模式下增加的11个

  implements  interface  let  package  private  protected  public  static  yield  arguments  eval

  注意:①这里所说的关键字及保留字都是全部小写的,因为JavaScript严格区分大小写,所以True就不是关键字了,它是一个普通的标识符;②ECMAScript 3将Java的所有关键字都列为自己的保留字,尽管这些保留字在ECMAScript 5中放宽了限制,但希望代码能在基于ECMAScript 3实现的解释器上运行的话,应当避免使用那些关键字做标识符;③JavaScript还预定义了很多全局变量和函数(30个,不过每一种特定的JavaScript运行环境都有一个自己的全局属性列表),应该避免把它们的名字做变量名或函数名,不过经测试使用它们做变量名浏览器也不会报错,也可以正常使用,但其原来的定义会被覆盖:

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

 

posted @ 2015-05-10 11:15  clearbug  阅读(963)  评论(0编辑  收藏  举报