數(shù)組骚灸、類數(shù)組糟趾、try/catch、es5嚴格模式
1甚牲、數(shù)組:【后期封裝方法基本都在Array.prototype上义郑,這樣之后創(chuàng)建的數(shù)組都能使用該方法】
(1).數(shù)組的創(chuàng)建方式:字面量、構(gòu)造函數(shù)丈钙;[創(chuàng)建數(shù)組的構(gòu)造函數(shù)只有系統(tǒng)定義的new Array();?不能自定義構(gòu)造函數(shù)非驮,所以相比于對象來說其更簡單] [字面量var?arr = [];?內(nèi)部等同于隱式調(diào)用的new Array();?原型鏈指向便是Array.prototype,創(chuàng)建的數(shù)組使用的方法也都是該Array.prototype上的特石,當然也可以自己封裝方法歧沪,丟到Array.prototype上宰掉,這樣之后創(chuàng)建的新數(shù)組就都有該方法了]
[1].js是弱類型語言蹂空,var arr = [1,2,3,"skr",{name:"xao"},[] ]; //?區(qū)別于強類型語言(定義數(shù)據(jù)類型后裂问,里面的數(shù)據(jù)類型就確定了)溶握,數(shù)組中可以放多種數(shù)據(jù)類型的數(shù)據(jù)脊凰;
[2].字面量創(chuàng)建與構(gòu)造函數(shù)創(chuàng)建:基本沒什么差別燕垃,唯一的一點:
var?arr = [1,2,3];?等同于 var arr = new Array(1,2,3);??
var arr1 = [10];//arr1[0]=10俏橘;? var arr1 = new Array(10);//10個數(shù)據(jù)(每個都是空),表示長度;?所以new Array(10.2);//報錯(長度不能為小數(shù))
(2).數(shù)組的方法:目前基于的是es3.0; (es5.0/es6.0增添了新數(shù)組方法栋盹,后續(xù)會學到)
[ es1.0已廢棄;es2.0沒有用到;es3.0最全例获、最基礎汉额,最標準的版本(之前所學都是基于此) ;es5.0增添了新方法(新版本瀏覽器支持榨汤,老版本瀏覽器不支持蠕搜,瀏覽器版本發(fā)布時候就確定了es標準);es6.0最新收壕、最強大的方法妓灌; es7.0 最新標準制定完成,市場還沒有投放] ;[es:ECMAScript;? DOM:通過javascript操作HTML頁面; BOM:通過javascript操作瀏覽器蜜宪,每個瀏覽器都不兼容(BOM可以隨便操作你的瀏覽器,開發(fā)中很少用到) ]
[1].可以改變原數(shù)組的方法:只有這七個push(); pop(); shift(); unshift(); reverse(); sort(); splice();
【unshift();封裝該方法的思路:添加的數(shù)封裝為一個數(shù)組虫埂,然后在該數(shù)組上push原數(shù)組;或者使用splice();方法圃验,從第0位開始截取掉伏,截取0位,放入添加的數(shù)據(jù)】
[2].重點剖析數(shù)組的排序方法sort();?系統(tǒng)默認采取的排序方法為"逐位ASCII碼比較"?升序澳窑;
var arr=[1,3,5,4,10,11];? arr.sort();//?[1, 10, 11, 3, 4, 5];
------------>>>>>系統(tǒng)為sort();方法留了接口斧散,可以自己封裝方法實現(xiàn)不同的功能,但是需要遵守下列的規(guī)則:1.方法內(nèi)必須寫兩個形參; 2.看返回值:當返回值為負數(shù)時摊聋,那么前面的數(shù)放到前面; 當返回值為正數(shù)時鸡捐,那么后面的數(shù)放到前面; 為0的時候,不動麻裁;[系統(tǒng)規(guī)則判斷的標準就是return值是正數(shù)還是負數(shù)來進行排序]??
最終版:arr.sort( function( a, b){return a-b; / return b-a });?這里的function(a,b){}?代表著函數(shù)的引用箍镜,可以寫成? var test = function(){};? ?arr.sort(test); 【重點依舊聚焦到底層實現(xiàn)的邏輯,巧妙應用sort();進行封裝方法實現(xiàn)自己想要的功能】
實際應用中排序1:
實際應用中排序2:
[3].不改變原數(shù)組的方法:concat(); toString(); slice();? join();//?后續(xù)es5.0煎源、es6.0的新方法也不能改變原數(shù)組色迂;
var arr = [1,2,3]? arr.toString();//"1,2,3";?將數(shù)組轉(zhuǎn)換為字符串,返回值絕對不是"[1,2,3]"
slice();//不寫參數(shù)表示截取所有數(shù)據(jù)薪夕;
arr.join("");//括號里必須是字符串(實際其也可以為原始值中的其他類型脚草,例如true,不過沒什么用處,記得其為字符串就可以啦)原献,其可將數(shù)組按相應字符轉(zhuǎn)換為字符串馏慨;相反的字符串的方法str.split("");//括號內(nèi)也必須是字符串,其可將字符串按相應字符進行轉(zhuǎn)換為數(shù)組;
arr.join("");//直接轉(zhuǎn)換為字符串姑隅;arr.join();//有逗號写隶;?str.split("");//每個都是字符串;str.split();//直接轉(zhuǎn)換為數(shù)組讲仰;
如何實現(xiàn):var str="hello" ----->>> "olleh"慕趴;str.split("").reverse().join("");
2、類數(shù)組:其必須有索引屬性、length屬性冕房,最好有push();?如果有splice();就更好了;[類數(shù)組還是和數(shù)組有區(qū)別躏啰,其沒有數(shù)組系統(tǒng)自帶的方法,需要手動去添加Array.prototype上的方法耙册,才能實現(xiàn)和數(shù)組上方法相同的功能]
【arguments就是類數(shù)組给僵,其只有l(wèi)ength/callee屬性,沒有數(shù)組的方法详拙,若想用需要手動添加方法】
[1].類數(shù)組核心必須要有l(wèi)ength屬性帝际,對象變?yōu)轭悢?shù)組后,既有對象的特性也有類數(shù)組的特性饶辙,兩者一起使用蹲诀,這樣在存儲方面更強大;
阿里面試題:
3弃揽、數(shù)組去重:
數(shù)組去重:巧妙使用對象的屬性“特性”脯爪,把數(shù)組的每個值作為對象的屬性,對象的屬性只能對應一個屬性值蹋宦,判斷:若是某屬性已經(jīng)有了屬性值披粟,那說明這個數(shù)就出現(xiàn)過了咒锻;
封裝type()方法:[解決typeof()的bug]
4. try{ } catch(e){ }
js運行三部曲冷冗,解釋執(zhí)行的時候當某行代碼發(fā)生錯誤的時候,下面的代碼便不會執(zhí)行惑艇,日常開發(fā)中常常會把可能發(fā)生錯誤的代碼放到try語句體內(nèi)來避免這種情況的發(fā)生蒿辙;[代碼出現(xiàn)錯誤的情況很多,也并非都是我們可控的滨巴,例如:后期涉及到前后端數(shù)據(jù)的傳輸思灌,很難保證數(shù)據(jù)是否有效傳輸,傳輸過程是否有錯誤]
(1).如果try{ }語句體內(nèi)的代碼發(fā)生錯誤恭取,之后不會執(zhí)行語句體內(nèi)發(fā)生錯誤的代碼后面的代碼(遇到第一條錯誤信息就中斷)泰偿,但依舊可以執(zhí)行外面的代碼;
(2).當try{ }語句體內(nèi)的代碼發(fā)生錯誤后蜈垮,可選擇執(zhí)行catch語句體內(nèi)的代碼耗跛;[catch:捕獲錯誤,形參e表示的是系統(tǒng)會把錯誤信息封裝成error對象然后傳給形參,該對象有兩個屬性err.name; err.message;形參名可以取其他名字都OK攒发,使用try{}catch(e){}; 其不會讓程序中斷(直接把錯誤信息輸出到控制臺上),而是將錯誤信息交由你處理调塌,你可以選擇輸出到控制臺console.log();或者打印出來呈現(xiàn)給用戶alert();也可以執(zhí)行任何代碼,一般操作的是打印錯誤信息惠猿,但好處是不會影響后續(xù)代碼的執(zhí)行羔砾;若是沒有錯誤,就不執(zhí)行catch語句]
(3).常見錯誤名稱:ReferenceError;? SyntaxError;(語法解析錯誤例如使用中文標點等)很常見;
補充:try{ }catch(err){ }finally{ };//try中寫進行錯誤測試的代碼塊姜凄,catch拋出錯誤信息政溃,finally在無論是否異常都會執(zhí)行;catch和finally語句都是可選的态秧,但在使用try語句時至少使用一個玩祟;throw語句來創(chuàng)建自定義信息(手動拋出異常)
5、es5.0嚴格模式:
瀏覽器版本發(fā)布的時候便確定了使用的es版本屿聋,目前瀏覽器都內(nèi)置es3.0和es5.0空扎,由于發(fā)生沖突使用的是es3.0,所以可理解為其是基于的es3.0和es5.0新增的一些方法(內(nèi)部含義:瀏覽器內(nèi)有兩種es版本润讥,當es3.0和es5.0發(fā)生沖突的時候转锈,瀏覽器默認使用的是es3.0版本的標準); 使用es5.0嚴格模式就是瀏覽器中當es3.0和es5.0發(fā)生沖突的時候,使用es5.0的語法標準楚殿;es5.0相比于es3.0語法更加嚴格撮慨,雖降低了js的靈活性,但可以減少錯誤脆粥;[es3.0 -->>> es5.0發(fā)展過程中摒棄了些舊語法砌溺,產(chǎn)生新語法而已]
(1).es5.0嚴格模式啟動:全局/局部,若全局使用变隔,則頁面中必須遵循es5.0的語法標準规伐;[使用字符串而不使用方法的原因:若使用strict();之前瀏覽器使用的是es3.0版本,其不能識別該方法便會報錯匣缘,那之后的代碼便不能執(zhí)行猖闪,使用字符串無論那個版本都不會報錯]
(2).es5.0嚴格模式(語法標準):其不支持with; arguments.callee; func.caller;?變量賦值前必須聲明,局部this必須被賦值(賦值什么就是什么),拒絕重復屬性和參數(shù)肌厨;等等嚴格模式有很多都是不支持的培慌,例如還有var a = 010;//8進制的數(shù),其在es3.0下是支持的柑爸,但在es5.0嚴格模式下報錯吵护;
[1].關于with的使用:with(){};// 參數(shù)為對象,其可以改變作用域鏈表鳍,參數(shù)會作為新AO對象放到作用域鏈的最頂端馅而;優(yōu)點:一些場合的使用可以優(yōu)化代碼,缺點:其操作作用域鏈进胯,很影響系統(tǒng)的性能用爪;
[es5.0嚴格模式下不支持:報錯]
[2].arguments.callee; func.caller; [es5.0嚴格模式下不支持:報錯]
[3].變量賦值前必須聲明,es3.0未聲明默認其是window暗示變量胁镐;es5.0未聲明便賦值偎血,報錯(xx is not defined);
[4].局部this必須被賦值(賦值什么就是什么);【全局和es3.0相同诸衔,局部若是沒有被賦值就是undefined】[new test();按照當初所學:this為{};?這里返回值為test {};?原因:前面是構(gòu)造函數(shù)的名,后面才是this指向的{};]
[5].拒絕重復屬性和參數(shù); es3.0出現(xiàn)重復屬性或參數(shù)會發(fā)生覆蓋現(xiàn)象颇玷,并不報錯笨农;es5.0嚴格模式下直接報錯;對象中的屬性也是如此 var obj {name:"xaohua",name:"xiaodon"}
補充:eval()的使用:es3.0中不支持其的使用(eval是魔鬼)帖渠,es5.0支持谒亦,其有兩個作用,1.把字符串當作代碼使用空郊;2.其可以改變作用域份招,不同情況下可針對作用域作出不同的操作,功能特別強大狞甚;