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 |
JavaScript语言核心之词法结构的更多相关文章
- 第一章:Javascript语言核心
本节是javascript语言的一个快速预览,也是本书的第一部分快速预览. 读此书之前,感谢淘宝技术团队对此javascript核心的翻译,感谢弗拉纳根写出此书.感谢你们无私的分享,仅以此笔记献给你们 ...
- 第一部分 JavaScript语言核心(二)
第四章 表达式和运算符 P66 运算符优先级,从上到下: p68 属性访问表达式和调用表达式的优先级比运算符优先级都要高,eg: typeof my.functions[x](y) //typeof在 ...
- JavaScript语言核心--词法结构
编程语言的词法结构是一套基础性规则,用来描述如何使用这门语言来编写程序.作为语法的基础,它规定了诸如变量名是什么样的.怎么写注释,以及程序语言之间如何分隔等规则. 1. 字符集 JavaScript程 ...
- 第一部分 JavaScript语言核心(一)
第二章 词法结构 P25 JavaScript是区分大小写的语言:但HTML不区分大小写(XHTML区分大小写,但浏览器具有强大的纠错能力.) 第三章 类型.变量和值 P32 var(variable ...
- C#6.0语言规范(二) 词法结构
程式 AC#程序由一个或多个源文件组成,正式称为编译单元(编译单元).源文件是Unicode字符的有序序列.源文件通常与文件系统中的文件一一对应,但不需要此对应关系.为了获得最大的可移植性,建议使用U ...
- Swift5 语言参考(二) 词法结构
词汇结构 Swift 的词法结构描述了什么样的字符序列形成了语言的有效标记.这些有效令牌构成语言的最低级构建块,用于描述后续章节中的其余语言.令牌由标识符,关键字,标点符号,文字或运算符组成. 在大多 ...
- 使用Firebug或chrome-devToolBar深入学习javascript语言核心
使用Firebug和chrome-devToolBar调试页面样式或脚本是前端开发每天必做之事.这个开发神器到底能给我们带来哪些更神奇的帮助呢?这几天看的一些资料中给了我启发,能不通过Firebug和 ...
- javascript权威指南笔记--javascript语言核心(一)
1.javascript的数据类型分为两类:原始类型和对象类型. 原始类型包括字符串.数字.布尔值.null.undefined. 对象是属性的集合,每个对象都由“名/值”对构成.数组和函数是特殊的对 ...
- JavaScript权威指南2.词法结构
字符集 1.用16位的Unicode字符集编写的,可以表示地球上通用的每一种书面语言.国际化 2.每个字符都是用两个字节表示的 3.大小写敏感:关键字.变量.函数名.标识符:HTML并不区分大小写 H ...
随机推荐
- 前台技术--通过javaScript提交表单
window.location=pp+"?username="+getCookie("username")+"&userid="+g ...
- WCF-001:WCF的发布
随着“云”时代的到来,“云”已经无处不在了.什么是“云”,无非就是利用互联网强大的功能建立多个服务器,然后再利用互联网的传输数据的特点将数据从某个服务器中读取出来或者将你的数据上传上去.当然这个服务器 ...
- 【原创】leetCodeOj ---Remove Duplicates from Sorted List II 解题报告
明日深圳行,心情紧张,写博文压压惊 囧 ------------------------------------- 原题地址: https://oj.leetcode.com/problems/rem ...
- 使用Intellij Idea生成可执行文件jar,开关exe文件步骤
确保其Java代码是没有问题的,在IDEA常执行的,然后.按以下步骤: 步骤一:打开File -> Project Structure -> Artifacts,例如以下图 步骤二:点击& ...
- 数据结构之计算器的实现(JAVA)(四)
原理: 1.将中序表达式变化兴许表达式 2.当前字符为数字,将该数字放入栈中 3.当前字符为操作符,从栈中取出两个树,依据操作符来运算,将运算结果放入到栈中 4.反复,直到将字符操作完.此时栈中仅仅剩 ...
- PC2日记——坑爹的第一天2014/08/28
我不想安慰自己说今天是因为第一次将pc2用于实际的比赛经验不足而导致的今天出现种种问题,我想说的是自从我開始干后台我所做的每一件事都是第一次,所以这绝对不是让自己免去责怪的理由:我想说的是假设我今天是 ...
- struts2充分国际化案例 错误解决
在struts2中须要做国际化的有: jsp页面的国际化,action错误信息的国际化,转换错误信息的国际化.校验错误信息的国际化 在之前的样例中已经做过和国际化相关的样例了,在struts.xml中 ...
- 菜鸟版JAVA设计模式-从抽象与实现说桥接模式
桥接模式,初学的时候事实上非常不理解为什么要把这个模式命名为桥接模式,脑海里突然联想到.事实上我学习是一件比較痛苦的事情,由于我必需要知道来龙去脉才干学的进去,所以,非常快我就对这个命名产生了兴趣,桥 ...
- Python学习笔记20:server先进
我们不依赖于一个框架,CGI如果是,只能使用socket介面.他完成了一个可以处理HTTP要求Pythonserver. 基于,不管是什么的计算机的操作系统(推荐Linux)和Python该计算机可被 ...
- Android设计模式(十)--生成器模式
回头看自己写的东西,大概Android当自己控制的定义,编写代码适用性比较高.但是,看看没有什么技术含量,因此,当在学习设计模式,想想有些东西是否可以改善,例如: 自己定义Dialog是Android ...