語法
1.數字
a. javascript只有一種數字類型,表示64位的浮點數,避免了短整型的溢出問題。1和1.0是相等的
b. 一個數字字面量有指數部分,那么字面量的值等于e之前的數字與10的e之后的數字的次方相等。所以100===1e2
c. NaN是一個數值,不等于任何值,包括他自己。可用isNaN(number)檢測NaN。
d. Infinity無窮大
2.字符串
a. 用單引號或者雙引號,\(反斜線)是轉義字符,由于Unicode是一個16位的字符集,所以javascript的字符串也是16位的。
b. \u指定數字字符編碼,如 “A” === "\u0041"
c. 字符串有length屬性
d. 字符串是不可變的,但是可以通過+運算創建新的字符串
3.語句
a. switch、while、for和do語句允許有一個可選的前置標簽,配合break使用。
b. false,null,undefined,空字符串' ? ',數字0,數字 NaN都是假,其他所有值都是真,包括true,字符串“false”,以及所有的對象。
c. for in語句。通常需要檢測object.hasOwnProperty(variable)來確定這個屬性名是該對象的成員,還是來自于原型鏈。
for(myvar in obj){
if(obj.hasOwnProperty(myvar)){...}
}
4.表達式
a. typeof 運算符產生的值有 'number'、'string'、'boolean'、'undefined'、'function'和'object'。數組或者null,結果是'object'
對象
javascript的簡單數據類型包含數字、字符串、布爾值、null和undefined。其他所有的值都是對象。
一個對象字面量就是包圍在一對花括號中的零或多個“名/值”對。
對象是“名/值”對的集合并擁有一個連到原型對象的隱藏鏈接。
1.引用
對象通過引用來傳遞,永遠不會被復制。
2.原型
每個對象都連接到一個原型對象,并且它可以從中繼承屬性。所有通過對象字面量創建的對象都連接到Object.prototype。
原型鏈在更新時是不起作用的。當我們對某個對象作出改變是,不會觸及該對象的原型,原型鏈只有在檢索值的時候才會被用到。
原型關系是一種動態的關系。如果我們添加一個新的屬性到原型中,該屬性會立即對所有寄語該原型創建的對象可見。
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運算符可以用來殺喊出對象的屬性。如果對象包含該屬性,那么該屬性就會被移除。它不會觸及原型鏈中的任何對象。刪除對象的屬性可能會讓來自原型鏈中的屬性透視出來。
4.減少全局變量污染
方法一、只創建一個唯一的全局變量。var MYAPP = {};
方法二、閉包
函數
1.函數對象
對象字面量產生的對象連接到Object.prototype。函數對象連接到Function.prototype(該源性對象本身連接到Object.prototype)。每個函數在創建的時候會附加兩個隱藏屬性:函數的上下文和實現函數行為的代碼。
一切對象都是Object的實例,一切函數都是Function的實例。Object是Function的實例,而Function.prototype是Object的實例。
可見,Object作為構造函數,它有prototype屬性指向Object.prototype, 作為實例對象, 它有Object.__proto__指向Function.prototype。Function是構造函數,它有prototype屬性指向Function.prototype,而Function是函數,從而也是Function的實例,所以它有Function.__proto__指向Function.prototype,從而Function.__proto__ === Function.prototype為true。
2.調用
每個函數在調用是都會接受兩個附加參數,this和arguments
4種調用模式:方法調用模式,函數調用模式,構造器調用模式和apply調用模式。
方法調用模式:函數保存為對象的一個屬性,我們稱它為一個方法。當一個方法被調用時,this被綁定到該對象
函數調用模式:當函數并非是一個對象的屬性時,那么他就被當做一個函數來調用,此時this綁定到全局對象
構造器調用模式:一個函數,如果創建的目的就是希望結合new前綴來調用,就稱它為構造器函數,首字母大寫。調用之后,實例對象的__proto__會鏈接到構造函數prototype的,this會被綁定到新對象上。
Apply調用模式:apply方法讓我們構建一個參數數組傳遞給調用函數。它允許我們選擇this的值。apply接收兩個參數,要綁定給this的值和參數數組。call,bind
function Qua(string){this.status = string}
Qua.prototype.get_status = function(){
return this.status;
}//構造一個包含status的對象
var statusObject = {status:'A-OK'};
//statusObject并沒有繼承Qua.prototype,但是可以調用get_status
var status = Qua.prototype.get_status.apply(statusObject);//傳入this,this指statusObject。結果是A-OK
3.參數
arguments并不是一個真正的數組,它只是一個類似數組的對象,擁有length屬性,但沒有任何數組的方法。
4.閉包
函數可以訪問它被創建時的所處的上下文環境。內部函數能訪問外部函數的實際變量而無需復制。
//錯誤示例
var add_the_handlers = function(nodes){
? ?var i;
for(i=0;i<nodes.length;i++){
nodes[i].onclick = function(){
alert(i);
}
}
}
//該函數的本意是想傳遞給每個事件處理器一個唯一的i,但是事件處理器函數綁定了變量i本身,而不是函數在構造是的變量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);//返回當前的i值
}
}
方法
1.Array
concat(item,...):如果參數item是數組,那么他的每一個元素會被分別添加
join(separator):默認的separator是逗號。
pop():移除數組中的最后一個元素并返回該元素。如果數組是empty,那么返回undefined
push(item...):把一個或多個參數item附加到數組尾部,如果item是數組,會把item座位整體添加到數組尾部,并返回這個array的新長度值。
reverse():反轉數組中的元素順序,并返回數組本身[數組被改變了]。
shift():移除數組中的第一個元素并返回該元素,如果是空數組,返回undefined。shift通常比pop慢的多。
slice(start,end):對數組中的一段做淺復制。
sort(comparefn):對數組中的元素進行排序,不能正確地給一組數字排序。因為javascript默認的比較函數會把被排序的元素都視為字符串。
splice(start,deleteCount,item...):從數組中移除一個或多個元素,并用新的item替換他們。
unshift(item...):和push類似,只是他是把item插入到數組的開始部分,并返回數組心得length。
2.Function
apply(thisArg,argArray):傳遞一個綁定到this上的對象和一個可選的數組作為參數。
3.Number
toExponential(fractionDigits):傳換成一個指數形式的字符串,可選參數是控制小數點后的數字位數,值必須在0-20.
toFixed(fractionDigits):轉換成一個十進制形式的字符串,可選參數是控制小數點后的數字位數,值必須在0-20,默認值是0
toPrecision(precision):轉換成一個十進制數形式的字符串??蛇x參數是控制數字的精度[和控制小數點位數是不一樣的,從整數部分算起],值必須在0-21
toString(radix):轉成字符串??蛇x參數radix控制基數,值在2-36之間,常用的是整數,但是可以用任意的數字。在最普通的情況下number.toString()可以簡單寫成String(number)。
4.Object
hasOwnProperty(name):如果一個object包含一個名為name的屬性,那么hasOwnproperty返回true。原型鏈中的同名屬性是不會被檢查的。
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):是使用正則表達式最強大(和最慢)的方法。匹配成功會返回一個數組。下標為0的是包含正則表達式regexp匹配的子字符串,下標為1的元素是分組1捕獲的文本...以此類推,如果匹配失敗,返回null。
regexp.test(string):最近單和最快的方法。盡量不要對這個方法使用g標識。返回true或false
6.String
string.charAt(pos):返回string中pos位置的字符。如果pos小于0或大于等于字符串的長度,返回空字符串。
string.charCodeAt(pos):返回string中pos位置處的字符的字符碼位。如果pos小于0或大于等于字符串的長度,返回空NaN
string.concat(string...)
string.indexOf(searchString,position):查找子串的位置
string.lastIndexOf(searchString,position):從末尾開始查找,但是position是從前往后數
var text = 'Mississippi';
text.lastIndexOf('ss');//5
text.lastIndexOf('ss',3);//原始string變成Miss ? 結果是2
text.lastIndexOf('ss',6);//原始串變成Mississ ?結果是5
string.localeCompare(that):
string.match(regexp):
string.replace(searchValue,replaceValue):只會替換第一次出現的,所以一般searchValue是一個帶有g標識的正則,這樣可以替換所有的匹配,如果不帶g,則只會替換第一個匹配。
string.search(regexp):參數是正則表達式,且會忽略g標識
string.slice(start,end):復制string的一部分出來構造一個新的字符串。如果start/end是負數,會與string.length相加
string.split(separator,limit):separator可以是字符串也可以是正則,limit顯示切片數量
string.substring(start,end):沒有任何理由去使用substring方法,用slice代替
string.toLocaleLowerCase():返回一個新的字符串,使用本地化的規則把string中的所有字幕轉換為小寫格式。此方法主要永在土耳其語上,因為在土耳其語中‘I’轉換為‘l’,而不是‘i’。
string.toLocaleUpperCase():轉換大寫格式,解釋參照toLocaleLowerCase()
string.toLowerCase():
string.toUpperCase():
String.fromCharCode(char...):根據一串數字編碼返回一個字符串 ?
var a = String.fromCharCode(67,97,116);//a是Cat
毒瘤
1.判斷數字:var isNumber = function(num){return typeof num === 'number' && isFinite(num);}
2.判斷是數組的可靠方法:
Object.prototype.toString.apply(arr) === '[object Array]'
Object.prototype.toString.apply(arguments) === '[object Arguments]'//可以判斷arguments數組不是真正的數組,只是含有length屬性而已,要通過Array.prototype.slice.apply(arguments)轉成數組
3.對象:
可以看到,constructor卻是一個字符串,原因在于count對象繼承自Object.prototype,而Object.prototype包含著一個名為constructor的成員對象它的值是一個Object,所以相加就變成了字符串拼接。解決辦法是添加一個判斷typeof count[word] == 'number'
JSON
json有6種類型的值,對象,數組,字符串,數字,布爾值和null。空白(空格,制表,回車,換行符)可被插入到任意值的前后。
使用JSON.parse可以代替evel帶來的風險