zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Taurus.MVC 2.2 开源发布:WebAPI 功能增强(请求跨域及Json转换)
    聊聊程序员如何学习英语单词:写了一个记单词的小程序
    ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
    关于开启.NET在线提升教育培训的通知!
    彻查手机端浏览博客园出现广告一事!
    ASP.NET Aries 入门开发教程9:业务表单的开发
    ASP.NET Aries 入门开发教程8:树型列表及自定义右键菜单
    ASP.NET Aries 入门开发教程7:DataGrid的行操作(主键操作区)
    ASP.NET Aries 入门开发教程6:列表数据表格的格式化处理及行内编辑
    ASP.NET Aries 入门开发教程5:自定义列表页工具栏区
  • 原文地址:https://www.cnblogs.com/craftsman-gao/p/4491938.html
Copyright © 2011-2022 走看看