第二章 語法
空白
多行注釋的字符可能會出現(xiàn)在正則表達式里沧卢,不太安全,例如:
*
var rm_a = /a*/.match(a);
*/標(biāo)識符
以字符街立、下劃線(_)和美元符($)開頭铃诬。數(shù)字
無整數(shù)類型坐昙,1和1.0的值相等恕出。
Infinity表示所有大于1.79769313486231570e+308的值唉铜。字符串
字符串是不可變的筷屡。
‘c’ + 'a' + 't' === 'cat'-
語句
1.下面的值被當(dāng)作假:- false
- null
- undefined
- 空字符串' '
- 數(shù)字 0
- 數(shù)字 NaN
其他所有值都被當(dāng)作真芜辕。
2.for in
檢測是否來自對象成員尚骄,或是原型鏈:
for (myvar in obj) {
if (obj.hasOwnProperty(myvar)){
···
}
} 表達式
typeof 運算符產(chǎn)生的值有'number'、'string'物遇、'boolean'乖仇、'undefined'、'function'和'object'字面量
函數(shù)
第三章 對象
- 對象字面量
- 檢索
- 更新
- 引用
對象通過引用來傳遞询兴。它們永遠不會被復(fù)制乃沙。 - 原型
如果嘗試去獲取對象的某個屬性值,但該對象沒有此屬性名诗舰,那么js會試著從原型對象中獲取屬性值警儒,直到object.prototype。這個過程叫委托眶根。 - 反射
- 枚舉
通過for 而不是for in ,不用擔(dān)心可能發(fā)掘出原型鏈中的屬性蜀铲。 - 刪除
刪除對象的屬性可能會讓來自原型鏈中的屬性透視出來。 - 減少全局變量污染
只創(chuàng)建一個唯一的全局變量属百。
var MYAPP = {};
第四章 函數(shù)
函數(shù)對象
js中函數(shù)就是對象记劝。函數(shù)對象連接到Function.prototype。函數(shù)可以擁有方法族扰。函數(shù)字面量
調(diào)用
方法調(diào)用模式
當(dāng)一個函數(shù)被保存為對象的一個屬性時厌丑,我們稱它為一個方法。方法可以使用this訪問自己所屬的對象渔呵,所以它能從對象中取值或?qū)ο筮M行修改怒竿,這種方法稱為公共方法。函數(shù)調(diào)用模式
當(dāng)一個函數(shù)并非一個對象的屬性時扩氢,它就是被當(dāng)作一個函數(shù)來使用的耕驰,this被綁定到全局對象。構(gòu)造器調(diào)用模式
一個函數(shù)如果創(chuàng)建的目的就是希望結(jié)合new前綴來調(diào)用的录豺,那么它被稱為構(gòu)造器函數(shù)朦肘。按照約定,以大寫格式命名双饥。Apply調(diào)用模式
apply方法讓我們構(gòu)建一個參數(shù)數(shù)組傳遞給調(diào)用函數(shù)媒抠,也允許指定this的值。參數(shù)
arguments并不是一個真正的數(shù)組兢哭,是個擁有l(wèi)ength屬性的array-like對象,沒有任何數(shù)組方法夫嗓。返回
一個函數(shù)總是會返回一個值迟螺。如果沒有指定返回值冲秽,則返回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. '');
});遞歸
作用域
最好在函數(shù)體的頂部聲明函數(shù)中的可能用到的所有變量窍株。閉包
避免在循環(huán)中創(chuàng)建函數(shù)民轴。
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);
}
};回調(diào)
-
模塊
模塊是一個提供接口卻隱藏狀態(tài)與實現(xiàn)的函數(shù)或?qū)ο蟆?br> 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
級聯(lián)
如果讓方法返回this就可以使用級聯(lián)。-
柯里化
柯里化允許我們把函數(shù)與傳遞給它的參數(shù)相結(jié)合球订,產(chǎn)成一個新的函數(shù)后裸。
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))); }; });
-
記憶
函數(shù)可以將先前的操作結(jié)果記錄在某個對象里,從而避免無謂的重復(fù)計算冒滩。
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); });