JavaScript六種數據類型
- 隱式轉換
+ :當兩個變量分別爲數字和字符串時,默認爲字符串拼接。
- :默認爲減法運算
Eg:32+32 ——>64
“32”+32——>”3232”
“32”-”32”——>0
運用技巧:num+”” 可將number類型的num轉換爲string類型
num-0可將string類型的num轉換爲number類型
- 數據類型
原始類型:number, string, boolean, null ,undefined, object,
Object中又包括:function,array,Date...
- “等於”
- “1.23”==1.23 :當等號兩邊一邊爲字符串一邊爲數字時,會嘗試把字符串轉換爲數字, 再進行比較。
- 0==false
- 一邊是boolean一邊是數字,會先把boolean轉換成數字再做比較。1==true——>true
- object==number|string嘗試將對象轉換爲基本類型(方法後面會講,包裝類)再比較 new String(‘hi’)==’hi’——>true
- Null==undefined
- new Object()==new Object()
- [1,2]==[1,2]
- “嚴格等於”
- a===b :首先會判斷等號左右兩邊的類型,如果類型不同,則返回false。
- null===null
- undefined===undefined
- NaN===NaN——>false
- new Object()===new Object()——>false不是兩個完全相同的對象
- [1,2]===[1,2]——>false 不是兩個完全相同的對象
- JaaScript包裝對象
String是一個字符串類型,而new string()則是一個對象類型,在對string類型的字符串做.length操作時,可以獲取其長度,在對string類型的字符串設置屬性時,也不會報錯,原因是在對字符串類型的變量做這些操作時,會將當前字符串轉換爲一個object類型的變量,並設置相應屬性,而當屬性設置完畢,這個臨時變量就會消失,因此再次調用這個變量時,會得到undefined的結果。(將一個基本類型的變量按照對象的方式去使用時,將該變量轉換爲包裝類型的臨時對象,完成訪問之後即刻銷燬。)
- JaaScript類型檢測
- typeof():多用於判斷基本類型或函數對象,返回值是一個字符串(“string”,”number”,”boolean”,”undefined”...)記住typeof(null)===”object”
- Instanceof 多用於判斷對象的類型,專門根據原型鏈判斷類型。
對象 instanceof 函數對象或函數構造器 如果右邊類型不符的話就會拋出
typeerror異常,(判斷左邊的左操作數對象的原型鏈上,是否有右邊這個構造
prototype屬性)
Eg: [1,2] instanceof Array===true
New Object() instanceof Array===false
- Object.prototype.toString()
Eg: Object.prototype.toString.apply([])===”[object Array]”
Object.prototype.toString.apply(function(){})===”[object Fuction]”
- 判斷兩個數組是否相等,可將兩個數組的toString()相比較。
JavaScript表達式
- 逗號表達式,一次從左到右計算表達式,最後結果取最右邊的:
var val=(1,2,3) // val=3
- num=’12’
num=+num
num=12
+num可以把字符串轉換爲數字
- delete運算符:操作對象,可通過configurable 控制對象中的元素是否可被刪除
var obj={x:1}; delete obj.x; obj.x//undefined
- 運算符in:判斷一個對象中是否有某個屬性
JavaScript語句
- try catch語句:try後面必須跟着一個catch或finally
try(){
//正常語句
throw new Error(“opps”)
}catch(ex){
//發生異常捕獲,並執行的語句,若沒有發生異常,此段代碼會被忽略掉
}finally{
//不管有沒有發生異常,該語句都會執行
}
Eg1:
當try後面沒有catch時,會跳到外層執行距離最近的catch裏面語句,但是在這之前,需要先執行當前try語句後的finally語句,因此最終執行結果如上圖。
Eg2:
Eg3:
當catch內部再一次拋出異常時,會先執行當前同級的finally語句,再將catch中拋出的異常拋到下一層catch語句中執行。
- Switch語句:
- 嚴格模式
JavaScript對象
- 屬性標籤
- value:屬性的值
- writable:當前屬性是否可寫。
- enumerable:當前屬性時否可遍歷(可枚舉)。在for in時是否會被遍歷出來。
- configurable:屬性標籤是否可以被修改,當前屬性是否可以被delete。
- 序列化
1、JSON.stringify中注意的問題(json.stringify叫做“序列化”)
當對象中的屬性的值爲undefined時,在json.stringify後的結果中不會出現該項屬性。
- 反向對應爲JSON.parse()
- 自定義序列化,在需要處理的對象屬性內部定義一個方法屬性toJSON,在函數內部做處理,此時的this指的是當前被操作的屬性。
JavaScript數組
1、數組的長度最大爲2的23次方-1
- 在數組的第一位添加元素的方法爲arr.unshift(添加的元素)
- delete arr[2]是把數組的下標爲2的元素置爲undefined,該元素的位置仍然在。
- arr.pop()刪除數組的最後一個元素
- arr.shift()刪除數組的第一個元素
- 判斷一個數組中是否存在某個索引用,num in arr,返回值爲true/false,其中num 爲索引值,當索引位置的元素爲undefined時,會返回false
- 數組的操作
(1)join():將數組轉換爲字符串,join的參數爲數組間元素的分隔符。
(2)reverse():數組逆序。(原數組被修改)
(3)sort():排序。(按照轉換爲字符串排序,當數組中元素爲數字,且爲兩位以上事,需要藉助函數排序)
eg:arr.sort(function(a,b){return a-b})(由小到大排序,原數組被修改)
- concat():數組合並,原數組未被修改。
特殊:var arr=[1,2,3]
arr.concat([4,5,[6,7]])
結果:[1,2,3,4,5,[6,7]]
arr.concat([10,11],13)
結果:[1,2,3,10,11,13]
會將concat的元素的中括號打開一層再concat進去。
(5)slice():返回部分數組,(原數組不會被修改)兩個參數,第一個參數,起始位置,第二個參數,終止位置,包前不包後,當沒有第二個參數時,默認到結尾。
(6)splice(a,b):刪除數組的一部分(會改變原數組)。a:要刪除元素的起始下標(包含),b:要刪除元素的個數。返回值爲被刪除的數組片段。
(7)arr.forEach():
- arr.map()遍歷數組
- arr.filter():
- arr.every():判斷數組中每一個元素都滿足某個條件。arr.some()判斷數組中是否存在某個元素滿足某個條件。返回true/false。
- arr.reduce():將數組中的元素進行兩兩操作。
其中的0,是第一次傳入的時候,第一次的x的值。再把第一次得到的結果當成下一次的X傳進去。
- arr.reduceRight():用法和上面一致,但是執行時從右向左執行數組中的元素。
- arr.indexOf(元素,起始下標):查找元素的位置,返回元素的下標。若未找到,則返回-1。
- arr.lastIndexOf(元素,起始下標):元素最後一次出現的位置。
- 判斷一個變量是否爲數組:
Array.isArray(被判斷變量); // true/false
JavaScript函數
- 函數聲明與表達式
函數聲明會被提前,而函數表達式不會。
- this
對象原型鏈上的this:對象o在p的原型鏈上p是{},但原型鏈上存在prop屬性
如果函數返回的是一個對象時,此時通過new出來的對象中的this爲return回的對象。
call,apply,bind:改變this的指向,區別是傳參形式不同。
- 函數屬性arguments
- arguments爲函數的參數數組,當函數被調用傳入參數時,arguments被賦值,此時arguments爲被傳入的參數,但在函數內部可對arguments進行賦值,此時arguments會被改寫,改寫的結果會影響函數的結果,但若在傳參時並沒有給對應的參數賦值,則在函數內部對未被傳參的參數賦值是無效的,還是會返回undefined。
- arguments.callee===當前函數名。多用於遞歸函數,使函數不用受到名稱的限制,通過arguments.callee即可調用本身。
- call、apply、bind的第一個參數爲this的指向,是個對象,若不是對象則會被轉成對象。若this被指向null或undefined,則默認this會指向全局對象window(對於瀏覽器是window,對於nodejs就是global對象)。(若是在嚴格模式下,this傳入什麼就是什麼,也不會轉換成對象了)
- bind與currying
1、適用場景:當函數中某幾個參數是固定的,但其他參數是在改變的,可以用bind先將其他參數固定,再只給其他參數傳值。
2、當使用new時,若return回來的不是對象,則會return this,且此時this會被初始化爲一個空對象,他的原型是foo.prototype,雖然此時使用了bind改變了this的指向,但是由於使用new,所以this還是指向一個空對象,由於設置了this屬性b,因此會返回一個帶有屬性b的對象。
JavaScript理解閉包、作用域
JavaScript OOP(面向對象編程)
- 改變prototype
當一個對象實例化之後,去改變它的原型對象,不會影響當前實例的屬性,但是會影響後續創建的實例。Bosn是student的實例。