JavaScript the Definitive Guide (5)
概述
在十到十二章中, 第十章的正则表达式内容最为丰富, 也是目前应用即为广泛的内容之一. 不过这里也主要是结合js的应用, 实际上正则表达式本身就是一个很值得研究的话题, 有不少书都在谈这个话题, 我后面要读的书目中恰巧就有这么一本, 后面会更加详细的学习以下正则表达式的方方面面.
十一章算是非常前沿, 高端或者说冷门的点了, 随着浏览器的盛行以及技术的进步, 安全问题始终都是一个很重视的点, 而在这种攻防演练中也促进了js本身的进步, 而主流浏览器本身更是走在了js的最前沿. 各种新的属性都是由他们引入而逐渐成为标准的;
十二章主要是对走出浏览器的JS做了一个简单的介绍, 而NodeJS的大名在近几年在前后端, 全端领域都可谓是人尽皆知. 我也会在之后阅读相关书籍的时候做更详细的笔记记录.
阅读笔记
Chapter 10 - Pattern Matching Regular Expressions
normal repetition characters:{m,n}匹配m-n次;{m,}匹配至少m次;{m}匹配恰好m次;?匹配0或1次;+匹配1或多次;*匹配0或多次;
Nongreedy repetition:??,+?,*?在常规的匹配后加上?就能让匹配尽可能发生的短, 它会在允许范围内, 找到尽可能短的匹配;
Alternation, Grouping, Reference:|表示匹配前者或者后者;(...)成组, 以组的形式来使用*,+,?等, 同时会记录组的匹配以用于Reference;(?:...)只是成组, 不记录匹配, 不能用于reference, 也不算做reference的序号中去;\n引用, n表示序号, 从1开始, 代表之前第几个group的匹配, 用于匹配开头结尾相同且多样的有奇效:/(['"])[^'"]*\1/匹配单引号或者双引号内的内容;- 需要注意的就是,
reference不能用于[]的character class之中!
anchor characters:^: 匹配开头;$: 匹配结尾;\b: 匹配词边界,/\bJava\b/=>Java\B: 匹配非词边界,/\B[Ss]cript\B/=>JavaScript, postscript...?=p: 表示内容需要匹配p规则,但是返回的命中中不包含这部分;?!p: 表示内容不匹配p规则;
flags:i: 大小写敏感, 即区分大小写;g: 全局匹配, 默认是匹配首个;m: 多行匹配;
String Methods for Pattern Matching:search(): 返回匹配词的位置或者-1代表无返回;replace(): 支持正则匹配替换, 同时支持替换时使用$n代表是正则匹配的引用, 比如text.replace(/"([^"]*)"/g, '“$1”');即替换""为“”;match(): 返回包含了匹配的结果, 返回结构为数组格式;split(): 接受正则匹配作为其分隔符, 比如:"1, 2, 3".split(/\s*,\s*/); => ["1","2","3"], 就去掉了本来直接split()多余的空格;
RegExp prototype method:exec(): 基本等同match(), 不过接受的是string类型去匹配, 而由正则去调用, 当表达式加了全局flag后,exec()每次执行会记录其上次匹配的位置并从此开始新的匹配, 比如:var pattern = /Java/g;pattern.exec("JavaScript is more fun than Java!").indexpattern.exec("JavaScript is more fun than Java!").index就会相继输出0,28两个位置;test(): 用以检测表达式是否匹配了传入的string, 其执行逻辑(g模式下记录上次匹配位置)和exec()一样;
Chapter 11 - JavaScript Subsets and Extensions
本章主要介绍一些目前主流浏览器支持但是还没有写入JavaScript官方版本中的一些js语言的子集(非官方版本)和扩展属性:
subsets: 通常是为了确保不确定安全性的代码能够安全的运行而出现的(除了Crockford’s JavaScript: The Good Parts);- ADsafe, 最早一个因为安全因素设计的子集语言, 会禁止对绝大多数全局变量的访问;
- [dojox.secure](http://www.sitepen.com/blog/2008/08/01/secure-mashups -with-dojoxsecure/): 算是Dojo toolkit的一个扩展;
- Caja: 其包含了两个子集, 一个是
Cajita, 比较严格, 类似ADsafe 和 dojox.secure; 还有个是Valija, 则比较接近如今ECMAScript 5的strict mode了; - Microsoft Web Sandbox;
- FBJS: facebook使用的一个自己;
通常子集都需要对应一个verifier, 来确保代码符合其要求;
extensions:const: 声明常量, 比如:const pi = 3.14;;let: 块变量声明, 相当于缩小版的var, 作用域仅存活在最近的一个块结构里, 你可以用{}来自行创建一个block;destructing: 允许多变量结构化赋值:let [x,y] = [1,2];let [r,theta] = polar(1.0, 1.0); function polar(x,y){...};甚至这种all = [first,second] = [1,2,3,4];或者这种let transparent = {r:0.0, g:0.0, b:0.0, a:1.0}; let {r:red, g:green, b:blue} = transparent;;for/each: 和for/in循环不同,for/each遍历对象的属性值而不是属性名, 且可操作类array对象;for/in: 从js 1.7(mozilla的js引擎版本号)开始,for/in也不局限在array和常规object了, 只要是可循环的元素都可以使用了;yield: 从python中引入的;Array Comprehensions: 还是从Python中借用的,let evensquares = [x*x for (x in range(0,10)) if (x % 2 === 0)];try/catch: 支持多catch;
Chapter 12 - Server-Side JavaScript
随着js的发展, 慢慢的超出了其本身的作用域: 浏览器. 随着Google V8引擎为js包入了unix的常用API: files,processes,streams,sockets等, js开始走出浏览器进入server端了. 正式命名为Node.JS. 想来很多人可能都听过, 因为后面我的数目中也包含了相关的书, 且本章内容也没见过太多, 所以就一起留到以后吧~