第二章 语法
-
空白
多行注释的字符可能会出现在正则表达式里,不太安全,例如:
*
var rm_a = /a*/.match(a);
*/ -
标识符
以字符、下划线(_)和美元符($)开头。 -
数字
无整数类型,1和1.0的值相等。
Infinity表示所有大于1.79769313486231570e+308的值。 -
字符串
字符串是不可变的。
‘c’ + 'a' + 't' === 'cat' -
语句
1.下面的值被当作假:- false
- null
- undefined
- 空字符串' '
- 数字 0
- 数字 NaN
其他所有值都被当作真。
2.for in
检测是否来自对象成员,或是原型链:
for (myvar in obj) {
if (obj.hasOwnProperty(myvar)){
···
}
} -
表达式
typeof 运算符产生的值有'number'、'string'、'boolean'、'undefined'、'function'和'object' -
字面量
-
函数
第三章 对象
- 对象字面量
- 检索
- 更新
- 引用
对象通过引用来传递。它们永远不会被复制。 - 原型
如果尝试去获取对象的某个属性值,但该对象没有此属性名,那么js会试着从原型对象中获取属性值,直到object.prototype。这个过程叫委托。 - 反射
- 枚举
通过for 而不是for in ,不用担心可能发掘出原型链中的属性。 - 删除
删除对象的属性可能会让来自原型链中的属性透视出来。 - 减少全局变量污染
只创建一个唯一的全局变量。
var MYAPP = {};
第四章 函数
-
函数对象
js中函数就是对象。函数对象连接到Function.prototype。函数可以拥有方法。 -
函数字面量
-
调用
-
方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。方法可以使用this访问自己所属的对象,所以它能从对象中取值或对对象进行修改,这种方法称为公共方法。 -
函数调用模式
当一个函数并非一个对象的属性时,它就是被当作一个函数来使用的,this被绑定到全局对象。 -
构造器调用模式
一个函数如果创建的目的就是希望结合new前缀来调用的,那么它被称为构造器函数。按照约定,以大写格式命名。 -
Apply调用模式
apply方法让我们构建一个参数数组传递给调用函数,也允许指定this的值。 -
参数
arguments并不是一个真正的数组,是个拥有length属性的array-like对象,没有任何数组方法。 -
返回
一个函数总是会返回一个值。如果没有指定返回值,则返回undefined。 -
异常
一个try语句只会有一个捕获所有异常的catch代码块。 -
扩充类型的功能
通过给Function.prototype增加一个method方法,下次给对象增加方法时就不必输入prototype。
Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};
取整方法
Number.method('integer', function(){
return Math[this < 0 ? 'cell' : 'floor'] (this);
});
移除字符串首尾空白
String.method('trim', function () {
return this.replace(/^\s+|\s+$/g. '');
}); -
递归
-
作用域
最好在函数体的顶部声明函数中的可能用到的所有变量。 -
闭包
避免在循环中创建函数。
var add_the_handlers = function (node) {
var helper = function (i) {
return function (e) {
alert(i);
};
};
var i;
for (i = 0; i < node.length; i += 1) {
nodes[i].onclick = helper(i);
}
}; -
回调
-
模块
模块是一个提供接口却隐藏状态与实现的函数或对象。
var serial_maker = function () {
var prefix = '';
var seq = 0;
return {
set_prefix: function (p) {
prefix = String(p);
},
set_seq: function (s) {
seq = s;
},
gensym: function () {
var result = prefix + seq;
seq += 1;
return result;
}
};
};var seqer = serial_maker(); seqer.set_prefix('Q'); seqer.set_seq(1000); var unique = seqer.gensym(); //Q1000
-
级联
如果让方法返回this就可以使用级联。 -
柯里化
柯里化允许我们把函数与传递给它的参数相结合,产成一个新的函数。
var add1 = add.curry(1);
add1(6); //7Function.method('curry',function () { var slice = Array.prototype.slice, args = slice.apply(arguments), that = this; return function () { return that.apply(null, args.concat(slice.apply(arguments))); }; });
-
记忆
函数可以将先前的操作结果记录在某个对象里,从而避免无谓的重复计算。
var memoizer = function (memo, formula) {
var recur = function (n) {
var result = memo[n];
if (typeof result !== 'number') {
result = formula(recur, n);
memo[n] = result;
}
return result;
};
return recur;
};var fibonacci = memoizer([0, 1],function (recur, n) { return recur (n - 1) + recur (n - 2); }); var factorial = memoizer([1,1], function (recur, n) { return n * recur (n - 1); });
网友评论