十九、正则表达式
A.创建正则表达式
1.字面量:/xyz/i,加载时编译
2.构造函数:new RegExp(‘xyz’,’i'),运行时编译
3.标识:
B.正则方法
C.标识/g的一些问题
1.带有/g的正则表达式不能内联
2.带有/g的正则表达式作为参数:为了安全起见,应该设置lastIndex为0(test()和exec()时)
3.共享带有/g的正则表达式:需要把lastIndex设置为0
D.提示与技巧
1.缺少断言(例如^、$)的正则表达式可以在任意位置匹配
2.匹配一切:new RegExp(‘’).test()或/(?:)/,不匹配任何字符:/.^/
E.正则表达式备忘单:P310
https://github.com/zhangyue0503/html5js/blob/master/speakingjavascript/19.js
二十、Date
A.Date构造函数
1.new Date(year, month,date?,hours?,minutes?,seconds?,milliseconds?)
B.Date原型方法
二十一、Math
A.Math属性
Math.E(欧拉常数)、Math.LN2(2的自然对数)、Math.LN10(10的自然对数)、Math.LOG2E(以2为底的e的对数)、Math.LOG10E(以10为底的e的对数)、Math.PI(圆周率)、Math.SQRT1_2(1/2的平方根)、Math.SQRT2(2的平方根)
B.数值函数
C.三角函数
D.其他函数
二十二、JSON
A.背景
1.遵循两个原则
B.JSON.stringify(value, replacer?,space?)
1.将值valueOf转换成JSON字符串
2.replacer用于转换前替换参数value:节点访问函数、属性键白名单
3.space影响输出格式,没有这个参数将以单行文本输出:可选数字和字符来控制缩进
4.解析不被JSON支持的内容:
5.JSON.stringify()遇到一个对象具有toJSON方法,则直接该方法来获得字符串化的值,内置toJSON的:
Boolean.prototype.toJSON()、Number.prototype.toJSON()、String.prototype.toJSON()、Date.prototype.toJSON()
C.JSON.parse(text, reviver?)
1.解析方便格式的JSON数据,返回相应的值
2.reviver是一个节点访问函数,可以用来转换解析后的数据
二十三、标准全局变量
A.构造器
Array、Boolean、Date、Function、Number、Object、RegExp、String
B.Error构造器
Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError
C.非构造器函数
D.通过eval()和new Function()来动态执行JS代码
1.非严格模式中,eval所执行的代码会在当前作用域下创建本地变量,而严格模式下不会
2.执行eval()的方式有两种
3.new Function()会创建全局作用域的函数
4.尽可能使用new Function()来替代eval执行代码,参数更为没弄明白
5.最佳实践是尽量避免使用eval()和new Function()。动态执行代码通常相对比较慢并且存在安全隐患
E.Console API
console.clear()、console.debug()、console.error()、console.exception()、console.info()、console.log()、console.trace()、console.warn()、console.assert()、console.count()、console.dir()、console.dirxml()、console.group()、console.groupCollapsed()、console.groupEnd()、console.table()、console.markTimeline()、console.profile()、console.profileEnd()、console.time()、console.timeEnd()、console.timeStamp()
二十四、编码和JavaScript
1.对于你自己的应用,可以使用Unicode。但是必须声明app的HTML页面是UTF-8编码的
二十五、ECMAScript 5 的新特性
P366-p369
二十六、元编程风格指南
A.通用技巧
1.代码应该具有一致性
2.代码应该易于理解:简短并不总是更好的;好的代码是一本教科书(代码应该解释正在发生的事情,注释应该解释事情为什么发生、文档应该填补代码和注释留下的空白);
3.不要自作聪明,不要让人思考
4.避免优化代码速度或大小
B.普遍认可的最佳实践
1.使用严格模式;总是使用分号;总是使用严格相等(===)和严格不等(!==);只有空格或只用制表符缩进,但不要混合使用;引用字符串;避免全局变量;
2.括号风格:使用1TBS,左括号开始于同一行的语句头部之后,if(x){这样
3.推荐字面量而不是构造函数
4.不要自作聪明:不要嵌套条件操作符;使用逻辑操作符时,不要简写if语句;使用自增或自减操作符作为语句而不要作为表达式;检查undefined;使用Math.round()转换整数;
5.可接受的技巧:使用或(||)提供默认值;使用泛型方法,把Object.prototype简写为{},把Array.prototype简写为[];ECMAScript5中末尾的逗号是合法的;ECMAScript5允许使用保留字作为属性键;
C.具有争议的规则
1.面向对象
二十七、调试的语言机制
二十八、子类化内置构造函数
A.术语
1.使用“子类化内置构造函数(subclass a built-in)”,而避免采用“扩展(extend)”
B.障碍1:具有内部属性的实例
1.在JS中常用的子类化技术是在子类构造函数中调用超类构造函数,且作用域中this指向子类自身
2.解决方法:直接复制方法和属性到实例中
C.障碍2:内置的构造函数不能作为方法调用
1.解决方法:在子类构造函数中,新建一个超类实例,并且将超类实例的属性复制到子类实例中
D.另一种解决方案:委托
二十九、JSDoc:生成API文档
1.通过/**来标记内容
三十、类库
1.shim和polyfill,在旧的JS引擎上改造新的功能
三十一、模块系统和包管理器
A.模块系统
1.CommonJS模块(CommonJS Module,CJS):化身就是Node.js模块,紧凑的语法、同步加载的设计、主要用于服务端
2.异步模块定义(Asynchronous Module Definition,AMD):典型就是Requirejs,语法稍复杂但不通过eval或者静态编译步骤就可以工作、异步加载的设计、主要用于浏览器
B.包管理器
npm、Bower、Browserify
三十二、其他工具
1.代码检测:JSLint、JSHint、ESLint
2.单元测试:Jasmine、mocha
3.压缩:UglifyJS、YUI Compressor、Closure Compiler