語(yǔ)法
1.數(shù)字
a. javascript只有一種數(shù)字類(lèi)型谤职,表示64位的浮點(diǎn)數(shù),避免了短整型的溢出問(wèn)題。1和1.0是相等的
b. 一個(gè)數(shù)字字面量有指數(shù)部分领跛,那么字面量的值等于e之前的數(shù)字與10的e之后的數(shù)字的次方相等。所以100===1e2
c. NaN是一個(gè)數(shù)值撤奸,不等于任何值吠昭,包括他自己‰使希可用isNaN(number)檢測(cè)NaN矢棚。
d. Infinity無(wú)窮大
2.字符串
a. 用單引號(hào)或者雙引號(hào),\(反斜線(xiàn))是轉(zhuǎn)義字符府喳,由于Unicode是一個(gè)16位的字符集蒲肋,所以javascript的字符串也是16位的。
b. \u指定數(shù)字字符編碼,如 “A” === "\u0041"
c. 字符串有l(wèi)ength屬性
d. 字符串是不可變的兜粘,但是可以通過(guò)+運(yùn)算創(chuàng)建新的字符串
3.語(yǔ)句
a. switch申窘、while、for和do語(yǔ)句允許有一個(gè)可選的前置標(biāo)簽孔轴,配合break使用剃法。
b. false,null,undefined,空字符串' ? ',數(shù)字0,數(shù)字 NaN都是假路鹰,其他所有值都是真贷洲,包括true,字符串“false”,以及所有的對(duì)象。
c. for in語(yǔ)句晋柱。通常需要檢測(cè)object.hasOwnProperty(variable)來(lái)確定這個(gè)屬性名是該對(duì)象的成員优构,還是來(lái)自于原型鏈。
for(myvar in obj){
if(obj.hasOwnProperty(myvar)){...}
}
4.表達(dá)式
a. typeof 運(yùn)算符產(chǎn)生的值有 'number'趣斤、'string'俩块、'boolean'、'undefined'浓领、'function'和'object'玉凯。數(shù)組或者null,結(jié)果是'object'
對(duì)象
javascript的簡(jiǎn)單數(shù)據(jù)類(lèi)型包含數(shù)字联贩、字符串漫仆、布爾值、null和undefined泪幌。其他所有的值都是對(duì)象盲厌。
一個(gè)對(duì)象字面量就是包圍在一對(duì)花括號(hào)中的零或多個(gè)“名/值”對(duì)。
對(duì)象是“名/值”對(duì)的集合并擁有一個(gè)連到原型對(duì)象的隱藏鏈接。
1.引用
對(duì)象通過(guò)引用來(lái)傳遞,永遠(yuǎn)不會(huì)被復(fù)制眷细。
2.原型
每個(gè)對(duì)象都連接到一個(gè)原型對(duì)象扬卷,并且它可以從中繼承屬性瘸洛。所有通過(guò)對(duì)象字面量創(chuàng)建的對(duì)象都連接到Object.prototype。
原型鏈在更新時(shí)是不起作用的。當(dāng)我們對(duì)某個(gè)對(duì)象作出改變是,不會(huì)觸及該對(duì)象的原型阀湿,原型鏈只有在檢索值的時(shí)候才會(huì)被用到。
原型關(guān)系是一種動(dòng)態(tài)的關(guān)系瑰妄。如果我們添加一個(gè)新的屬性到原型中陷嘴,該屬性會(huì)立即對(duì)所有寄語(yǔ)該原型創(chuàng)建的對(duì)象可見(jiàn)。
function F(){}
F.prototype.a=[1,2];
var f = new F();
f.a.push(3);
F.prototype.a;//[1,2,3]原型被修改
f.a = null;
F.prototype.a;//[1,2,3]原型不變
3.刪除
delete運(yùn)算符可以用來(lái)殺喊出對(duì)象的屬性间坐。如果對(duì)象包含該屬性灾挨,那么該屬性就會(huì)被移除邑退。它不會(huì)觸及原型鏈中的任何對(duì)象。刪除對(duì)象的屬性可能會(huì)讓來(lái)自原型鏈中的屬性透視出來(lái)涨醋。
4.減少全局變量污染
方法一瓜饥、只創(chuàng)建一個(gè)唯一的全局變量。var MYAPP = {};
方法二浴骂、閉包
函數(shù)
1.函數(shù)對(duì)象
對(duì)象字面量產(chǎn)生的對(duì)象連接到Object.prototype。函數(shù)對(duì)象連接到Function.prototype(該源性對(duì)象本身連接到Object.prototype)宪潮。每個(gè)函數(shù)在創(chuàng)建的時(shí)候會(huì)附加兩個(gè)隱藏屬性:函數(shù)的上下文和實(shí)現(xiàn)函數(shù)行為的代碼溯警。
一切對(duì)象都是Object的實(shí)例,一切函數(shù)都是Function的實(shí)例狡相。Object是Function的實(shí)例梯轻,而Function.prototype是Object的實(shí)例。
可見(jiàn)尽棕,Object作為構(gòu)造函數(shù)喳挑,它有prototype屬性指向Object.prototype, 作為實(shí)例對(duì)象, 它有Object.__proto__指向Function.prototype滔悉。Function是構(gòu)造函數(shù)伊诵,它有prototype屬性指向Function.prototype,而Function是函數(shù)回官,從而也是Function的實(shí)例曹宴,所以它有Function.__proto__指向Function.prototype,從而Function.__proto__ === Function.prototype為true歉提。
2.調(diào)用
每個(gè)函數(shù)在調(diào)用是都會(huì)接受兩個(gè)附加參數(shù)笛坦,this和arguments
4種調(diào)用模式:方法調(diào)用模式,函數(shù)調(diào)用模式苔巨,構(gòu)造器調(diào)用模式和apply調(diào)用模式版扩。
方法調(diào)用模式:函數(shù)保存為對(duì)象的一個(gè)屬性,我們稱(chēng)它為一個(gè)方法侄泽。當(dāng)一個(gè)方法被調(diào)用時(shí)礁芦,this被綁定到該對(duì)象
函數(shù)調(diào)用模式:當(dāng)函數(shù)并非是一個(gè)對(duì)象的屬性時(shí),那么他就被當(dāng)做一個(gè)函數(shù)來(lái)調(diào)用蔬顾,此時(shí)this綁定到全局對(duì)象
構(gòu)造器調(diào)用模式:一個(gè)函數(shù)宴偿,如果創(chuàng)建的目的就是希望結(jié)合new前綴來(lái)調(diào)用,就稱(chēng)它為構(gòu)造器函數(shù)诀豁,首字母大寫(xiě)窄刘。調(diào)用之后,實(shí)例對(duì)象的__proto__會(huì)鏈接到構(gòu)造函數(shù)prototype的舷胜,this會(huì)被綁定到新對(duì)象上娩践。
Apply調(diào)用模式:apply方法讓我們構(gòu)建一個(gè)參數(shù)數(shù)組傳遞給調(diào)用函數(shù)活翩。它允許我們選擇this的值。apply接收兩個(gè)參數(shù)翻伺,要綁定給this的值和參數(shù)數(shù)組材泄。call,bind
function Qua(string){this.status = string}
Qua.prototype.get_status = function(){
return this.status;
}//構(gòu)造一個(gè)包含status的對(duì)象
var statusObject = {status:'A-OK'};
//statusObject并沒(méi)有繼承Qua.prototype,但是可以調(diào)用get_status
var status = Qua.prototype.get_status.apply(statusObject);//傳入this,this指statusObject吨岭。結(jié)果是A-OK
3.參數(shù)
arguments并不是一個(gè)真正的數(shù)組拉宗,它只是一個(gè)類(lèi)似數(shù)組的對(duì)象,擁有l(wèi)ength屬性辣辫,但沒(méi)有任何數(shù)組的方法旦事。
4.閉包
函數(shù)可以訪(fǎng)問(wèn)它被創(chuàng)建時(shí)的所處的上下文環(huán)境。內(nèi)部函數(shù)能訪(fǎng)問(wèn)外部函數(shù)的實(shí)際變量而無(wú)需復(fù)制急灭。
//錯(cuò)誤示例
var add_the_handlers = function(nodes){
? ?var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick = function(){
alert(i);
}
}
}
//該函數(shù)的本意是想傳遞給每個(gè)事件處理器一個(gè)唯一的i,但是事件處理器函數(shù)綁定了變量i本身姐浮,而不是函數(shù)在構(gòu)造是的變量i的值
//改良版
var add_the_handlers = function(nodes){
var helper = function(i){
return function(e){alert(i)}
}
var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclock=helper(i);//返回當(dāng)前的i值
}
}
方法
1.Array
concat(item,...):如果參數(shù)item是數(shù)組,那么他的每一個(gè)元素會(huì)被分別添加
join(separator):默認(rèn)的separator是逗號(hào)葬馋。
pop():移除數(shù)組中的最后一個(gè)元素并返回該元素卖鲤。如果數(shù)組是empty,那么返回undefined
push(item...):把一個(gè)或多個(gè)參數(shù)item附加到數(shù)組尾部,如果item是數(shù)組畴嘶,會(huì)把item座位整體添加到數(shù)組尾部蛋逾,并返回這個(gè)array的新長(zhǎng)度值。
reverse():反轉(zhuǎn)數(shù)組中的元素順序掠廓,并返回?cái)?shù)組本身[數(shù)組被改變了]换怖。
shift():移除數(shù)組中的第一個(gè)元素并返回該元素,如果是空數(shù)組蟀瞧,返回undefined沉颂。shift通常比pop慢的多。
slice(start,end):對(duì)數(shù)組中的一段做淺復(fù)制悦污。
sort(comparefn):對(duì)數(shù)組中的元素進(jìn)行排序铸屉,不能正確地給一組數(shù)字排序。因?yàn)閖avascript默認(rèn)的比較函數(shù)會(huì)把被排序的元素都視為字符串切端。
splice(start,deleteCount,item...):從數(shù)組中移除一個(gè)或多個(gè)元素彻坛,并用新的item替換他們。
unshift(item...):和push類(lèi)似踏枣,只是他是把item插入到數(shù)組的開(kāi)始部分昌屉,并返回?cái)?shù)組心得length。
2.Function
apply(thisArg,argArray):傳遞一個(gè)綁定到this上的對(duì)象和一個(gè)可選的數(shù)組作為參數(shù)茵瀑。
3.Number
toExponential(fractionDigits):傳換成一個(gè)指數(shù)形式的字符串间驮,可選參數(shù)是控制小數(shù)點(diǎn)后的數(shù)字位數(shù),值必須在0-20.
toFixed(fractionDigits):轉(zhuǎn)換成一個(gè)十進(jìn)制形式的字符串马昨,可選參數(shù)是控制小數(shù)點(diǎn)后的數(shù)字位數(shù)竞帽,值必須在0-20扛施,默認(rèn)值是0
toPrecision(precision):轉(zhuǎn)換成一個(gè)十進(jìn)制數(shù)形式的字符串∫俾ǎ可選參數(shù)是控制數(shù)字的精度[和控制小數(shù)點(diǎn)位數(shù)是不一樣的疙渣,從整數(shù)部分算起],值必須在0-21
toString(radix):轉(zhuǎn)成字符串堆巧⊥螅可選參數(shù)radix控制基數(shù),值在2-36之間恳邀,常用的是整數(shù)懦冰,但是可以用任意的數(shù)字。在最普通的情況下number.toString()可以簡(jiǎn)單寫(xiě)成String(number)谣沸。
4.Object
hasOwnProperty(name):如果一個(gè)object包含一個(gè)名為name的屬性,那么hasOwnproperty返回true笋颤。原型鏈中的同名屬性是不會(huì)被檢查的乳附。
var a = {member:true};
var b = Object.create(a);a.hasOwnproperty('member');//true
b.hasOwnproperty('member');//false
b.member;//true
5.RegExp
regexp.exec(string):是使用正則表達(dá)式最強(qiáng)大(和最慢)的方法。匹配成功會(huì)返回一個(gè)數(shù)組伴澄。下標(biāo)為0的是包含正則表達(dá)式regexp匹配的子字符串赋除,下標(biāo)為1的元素是分組1捕獲的文本...以此類(lèi)推,如果匹配失敗非凌,返回null举农。
regexp.test(string):最近單和最快的方法。盡量不要對(duì)這個(gè)方法使用g標(biāo)識(shí)敞嗡。返回true或false
6.String
string.charAt(pos):返回string中pos位置的字符颁糟。如果pos小于0或大于等于字符串的長(zhǎng)度,返回空字符串喉悴。
string.charCodeAt(pos):返回string中pos位置處的字符的字符碼位棱貌。如果pos小于0或大于等于字符串的長(zhǎng)度,返回空NaN
string.concat(string...)
string.indexOf(searchString,position):查找子串的位置
string.lastIndexOf(searchString,position):從末尾開(kāi)始查找,但是position是從前往后數(shù)
var text = 'Mississippi';
text.lastIndexOf('ss');//5
text.lastIndexOf('ss',3);//原始string變成Miss ? 結(jié)果是2
text.lastIndexOf('ss',6);//原始串變成Mississ ?結(jié)果是5
string.localeCompare(that):
string.match(regexp):
string.replace(searchValue,replaceValue):只會(huì)替換第一次出現(xiàn)的箕肃,所以一般searchValue是一個(gè)帶有g(shù)標(biāo)識(shí)的正則婚脱,這樣可以替換所有的匹配,如果不帶g勺像,則只會(huì)替換第一個(gè)匹配障贸。
string.search(regexp):參數(shù)是正則表達(dá)式,且會(huì)忽略g標(biāo)識(shí)
string.slice(start,end):復(fù)制string的一部分出來(lái)構(gòu)造一個(gè)新的字符串吟宦。如果start/end是負(fù)數(shù)篮洁,會(huì)與string.length相加
string.split(separator,limit):separator可以是字符串也可以是正則,limit顯示切片數(shù)量
string.substring(start,end):沒(méi)有任何理由去使用substring方法督函,用slice代替
string.toLocaleLowerCase():返回一個(gè)新的字符串嘀粱,使用本地化的規(guī)則把string中的所有字幕轉(zhuǎn)換為小寫(xiě)格式激挪。此方法主要永在土耳其語(yǔ)上,因?yàn)樵谕炼湔Z(yǔ)中‘I’轉(zhuǎn)換為‘l’,而不是‘i’锋叨。
string.toLocaleUpperCase():轉(zhuǎn)換大寫(xiě)格式垄分,解釋參照toLocaleLowerCase()
string.toLowerCase():
string.toUpperCase():
String.fromCharCode(char...):根據(jù)一串?dāng)?shù)字編碼返回一個(gè)字符串 ?
var a = String.fromCharCode(67,97,116);//a是Cat
毒瘤
1.判斷數(shù)字:var isNumber = function(num){return typeof num === 'number' && isFinite(num);}
2.判斷是數(shù)組的可靠方法:
Object.prototype.toString.apply(arr) === '[object Array]'
Object.prototype.toString.apply(arguments) === '[object Arguments]'//可以判斷arguments數(shù)組不是真正的數(shù)組,只是含有l(wèi)ength屬性而已娃磺,要通過(guò)Array.prototype.slice.apply(arguments)轉(zhuǎn)成數(shù)組
3.對(duì)象:
可以看到薄湿,constructor卻是一個(gè)字符串,原因在于count對(duì)象繼承自O(shè)bject.prototype偷卧,而Object.prototype包含著一個(gè)名為constructor的成員對(duì)象它的值是一個(gè)Object,所以相加就變成了字符串拼接豺瘤。解決辦法是添加一個(gè)判斷typeof count[word] == 'number'
JSON
json有6種類(lèi)型的值,對(duì)象听诸,數(shù)組坐求,字符串,數(shù)字晌梨,布爾值和null桥嗤。空白(空格仔蝌,制表泛领,回車(chē),換行符)可被插入到任意值的前后敛惊。
使用JSON.parse可以代替evel帶來(lái)的風(fēng)險(xiǎn)