JavaScript the Definitive Guide (5)

100
TaoAlpha
2015-06-243280 words10 minutes to read

概述

在十到十二章中, 第十章的正则表达式内容最为丰富, 也是目前应用即为广泛的内容之一. 不过这里也主要是结合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. 想来很多人可能都听过, 因为后面我的数目中也包含了相关的书, 且本章内容也没见过太多, 所以就一起留到以后吧~

参考文献: