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 ...
随机推荐
- 【ThinkingInC++】8、说明,浅谈数据类型的大小
/** * 特征:说明.浅谈数据类型的大小 * 时刻:2014年8一个月10日本11:02:02 * 笔者:cutter_point */ #include<iostream> using ...
- Java 序列化Serializable详解(附详细例子)
Java 序列化Serializable详解(附详细例子) 1.什么是序列化和反序列化 Serialization(序列化)是一种将对象以一连串的字节描述的过程:反序列化deserialization ...
- 使用Spring的@Autowired 实现DAO, Service, Controller三层的注入(转)
简述: 结合Spring和Hibernate进行开发 使用@Autowired实现依赖注入, 实现一个学生注册的功能,做一个技术原型 从DAO(Repository) -> Service -& ...
- Oracle如何插入在特殊字符: & 和 ' (各种解决方案)
分类: Oracle Oracle中怎样插入特殊字符:& 和 ' (多种解决方式) 今天在导入一批数据到Oracle时,碰到了一个问题:Toad提示要给一个自己定义变量AMP赋值,一開始我非常 ...
- 无阻塞情况connect生产EINPROGRESS错
今天的游戏开发client测试程序,非常多,因为出现client.后connect成功.代码证recv系统调用.后来发现,可能是由于socket默认模式被阻止,这将使很多client 接处于链接却不能 ...
- 【Linux探索之旅】第一部分第五课:Unity桌面,人生若只如初见
内容简介 1.第一部分第五课:Unity桌面,人生若只如初见 2.第一部分第六课预告:Linux如何安装在虚拟机中 Unity桌面,人生若只如初见 不容易啊,经过了前几课的学习,我们认识了Linux是 ...
- 座IO理解力
一般堵塞IO服务器通信,通常有一个单独的Acceptor线程负责监控client联系,它接收client对于每个请求连接后client分配用于处理一个新的线程,处理后.返回应答给client.线程才销 ...
- 动软.NET 分页存储过程UP_GetRecordByPage
1, ------------------------------------ --用途:支持任意排序的分页存储过程 --说明: ----------------------------------- ...
- POJ3467(预处理)
Cross Counting Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1331 Accepted: 375 De ...
- 与我一起extjs5(04--MVVM简要说明财产)
与我一起extjs5(04--MVVM简要说明财产) 以下我们来看一下自己主动生成的代码中的MVVM架构的关系. Main是一个可视的控件,MainController是这个控件的控制 ...