[toc]?
?##1寸潦、基礎(chǔ)知識>ECMAScript(ES):規(guī)定了JS的一些基礎(chǔ)核心的知識(變量、數(shù)據(jù)類型、語法規(guī)范夜惭、操作語句等)>DOM:document object model 文檔對象模型苦银,里面提供了一些屬性和方法啸胧,可以讓我們操作頁面中的元素>BOM:browser object model 瀏覽器對象模型,里面提供了一些屬性和方法幔虏,可以讓我們操作瀏覽器###常用瀏覽器內(nèi)核瀏覽器的內(nèi)核是分為兩個部分的纺念,一是渲染引擎,另一個是JS引擎∷疲現(xiàn)在JS引擎比較獨立柠辞,內(nèi)核更加傾向于說渲染引擎。>- webkit內(nèi)核(V8引擎)> - 谷歌> - 大部分移動端瀏覽器> - 國內(nèi)大部分瀏覽器 360 QQ UC 獵豹 搜狗> - NODE基于V8來渲染JS>- Gecko 火狐瀏覽器>- Presto 歐朋瀏覽器> - Trident IE瀏覽器###數(shù)據(jù)類型的分類和檢測@[基本數(shù)據(jù)類型, 執(zhí)行步驟:, 引用數(shù)據(jù)類型] + Number + String + bloean + null:空對象指針 + undefined:未定義@[引用數(shù)據(jù)類型] + function 函數(shù)類型 + object對象數(shù)據(jù)類型: + {}普通對象 + 數(shù)組 + /$/ 正則[對象數(shù)據(jù)類型:是把描述同一事物的屬性和方法放在一個內(nèi)存空間中主胧,起到了分組的作用]####檢測數(shù)據(jù)類型- typeof:檢測數(shù)據(jù)類型的運算符- instanceof:檢測某個實例是否屬于這個類- constructor:獲取當(dāng)前實例的構(gòu)造器- Object.prototype.toString.call:獲取當(dāng)前實例所屬的類信息>Object.prototype.toString.call()方法測出的結(jié)果最準確叭首,其他都有局限性,得出的結(jié)果`[object 所屬類型]````Object.prototype.toString.call()==({}).toString.call()//true//每個類都是函數(shù) 只是函數(shù)名稱不同Object.toString()==Function.toString();//false```**typeof**:結(jié)果返回的是一個字符串踪栋,字符串內(nèi)包含的是數(shù)據(jù)類型- typeof 的局限性 - ==typeof null 的檢測結(jié)果不是‘null' 而是’object': 而null是基本數(shù)據(jù)類型 焙格,并不是object== - 使用typeof 無法具體區(qū)分出到底是數(shù)組還是正則或普通對象###Boolean>- 把其他類型轉(zhuǎn)換為布爾類型>- 只有==0,NaN,空字符串夷都、null眷唉、undefined==為false;其余都是true;>>- ! 或者 !!的意義>`!:先將數(shù)據(jù)類型轉(zhuǎn)化為布爾值囤官,再取反`>`!!:兩次取反相當(dāng)于沒有取反冬阳,只是把數(shù)據(jù)類型轉(zhuǎn)化為布爾類型`!null => true!!undefined =>false ###Number@`[NaN]`>- js中新增了一個數(shù)據(jù)類型:NaN(not a number 不是一個有效數(shù)字,但是屬于number) > + typeof NaN =>'number' >- `NaN!=NaN NaN和任何值都不等`@`[isNaN]` >isNaN:用來檢測這個值==是否不是有效數(shù)字==党饮,如果不是肝陪,則為true,反之,則為false>當(dāng)時使用isNaN檢測時刑顺,()中如果不是number類型:>基本數(shù)據(jù)類型:==先將其他類型值轉(zhuǎn)化為Number類型值==再運算>對象數(shù)據(jù)類型:==先將對其調(diào)用toString方法氯窍,再轉(zhuǎn)化為Number類型值==@`[Number]`>- 使用Number把字符串轉(zhuǎn)換為數(shù)字的時候,空字符串是零蹲堂,其它字符串中如果出現(xiàn)的字符代表純數(shù)字可以轉(zhuǎn)為正常的數(shù)字狼讨,如果出現(xiàn)了任何一個非有效數(shù)字的字符,最后的結(jié)果都是NaN>- 將引用類型轉(zhuǎn)化數(shù)據(jù)類型時柒竞,先將其轉(zhuǎn)化為字符串政供,后再轉(zhuǎn)化為number;({name:'zxt'}).toString() =>"[object Object]"Number(undefined) =>NaN@`[parseInt()]`>將其他類型值轉(zhuǎn)換number,和Number不同,提取規(guī)則:從左至右依次查找有效數(shù)字字符,直到遇見非有效字符為止(不管后面還有沒數(shù)字)> - parseInt('12px') =>12> - parseInt('px1') =>NaN> - parseInt('122.3') =>122@`[parseFloat()]`> 與parseInt不同的是支持小數(shù)> + parseFloat('12.34pxc')= 12.34`由于浮點數(shù)不是精確的值鲫骗,所以涉及小數(shù)的比較和運算要特別小心````0.1 + 0.2 === 0.3// false0.3 / 0.1// 2.9999999999999996```@`[toFixed()]`>控制數(shù)字保留小數(shù)點后面幾位```1.var num = parseFloat('width:12.5px'); //=>NaN2.if(num==12.5){3. alert(12.5);4.}else if(num==NaN){//=> NaN!=NaN5. alert(NaN);6.}else if(typeof num=='number'){//=> typeof NaN->'number'7. alert(0);//=>'0'8.}else{9. alert('啥也不是!');10.}```#####null 和 undefinednull: 沒有,沒有開辟內(nèi)存空間undefined: 未定義"" : 空字符串犬耻,什么都沒有,但是開辟了內(nèi)存空間null:什么都沒有执泰,但一般都是自己手動賦值的枕磁,后期再自己賦值unfefined:完全不在預(yù)期之內(nèi)###Object`對象是由0到多組鍵值對組成的,每一組之間用逗號分離`>每一個對象數(shù)據(jù)類型术吝,都是有0到多組的屬性名和屬性值組成的>屬性名:描述當(dāng)前對象具備的某些特征(數(shù)字/字符串格式)>屬性值:具體特征的值(任何數(shù)據(jù)類型)> >操作一個對象的屬性有2種方式 >`obj['key']` >`obj.key`(屬性名是數(shù)字不可以使用這種方法)**創(chuàng)建對象**>字面量方式:var obj={}>構(gòu)造函數(shù)方式:var obj=new Object();**對象鍵值對的操作:增计济、刪、改排苍、查**>var obj = {};>obj.name = 'zxt';//=>增加一個叫做NAME的屬性,屬性值是:'zxt'>obj['name'] = 29;//=>修改NAME對應(yīng)的屬性值:`一個對象的屬性名是不能重復(fù)的`沦寂,之前沒有這個屬性,我們的操作是增加操作淘衙,之前有這個屬性传藏,當(dāng)前操作就是在修改現(xiàn)有屬性名的屬性值>obj.age = null; //=>假刪除:把屬性值設(shè)置為空,但是屬性名是存在的 <=> obj['age'] = null =>獲取age的屬性值結(jié)果是null>delete obj.age;//=>真刪除:把屬性名和屬性值徹底從對象中移除掉 =>獲取age的屬性值結(jié)果是undefined>`獲取一個對象某一個屬性名對應(yīng)的屬性值彤守,如果當(dāng)前這個屬性在對象中并不存在毯侦,獲取的結(jié)果是undefined`**`obj[name]和obj['name']的區(qū)別`**```//-> age:變量名,代表的是它存儲的值//-> 'age':常量具垫,字符串的具體值var age = 'name';var obj = {name:'zhufeng',age:8};console.log(obj.age); =>8console.log(obj['age']); =>8console.log(obj[age]); => obj[age變量] =>obj['name'] =>獲取name屬性名的屬性值 =>'zhufeng'```####Object.keys:>Object.keys 返回一個所有元素為`字符串的數(shù)組`侈离,其元素來自于從給定的對象上面可直接枚舉的屬性。這些屬性的順序與手動遍歷該對象屬性時的一致筝蚕。`可以用來判斷對象是否為空:Object.keys(obj).length````let obj = { 0 : "a", 1 : "b", 2 : "c"};console.log(Object.keys(obj));// ['0', '1', '2']```###函數(shù)數(shù)據(jù)類型>函數(shù)數(shù)據(jù)類型也是按照引用地址來操作的>函數(shù):具備一定功能的方法###基本數(shù)據(jù)類型和引用數(shù)據(jù)類型的區(qū)別>JS是運行在瀏覽器中的(內(nèi)核引擎)卦碾,==瀏覽器會給JS提供一個賴以生存的環(huán)境==,所以我們把這個環(huán)境叫做==全局作用域 window(global是后臺的)==>>JS代碼是自上而下依次執(zhí)行的基本數(shù)據(jù)類型是==按值==操作的:基本數(shù)據(jù)類型再賦值時起宽,是直接把值賦值給變量即可var a=12;var b=a; // b=12 把變量a存的值賦值給變量bb=13;alert(a); //a=12`引用數(shù)據(jù)類型是按空間地址(引用地址)來操作的:`var n={name:'主動'}洲胖; 1、先創(chuàng)建一個變量n; 2.瀏覽器首先會開辟一個存儲空間(內(nèi)存空間)坯沪,是把對象中需要存儲的鍵值對分別存儲在這個空間中宾濒,后期為了方便找到這個空間,瀏覽器會給空間設(shè)個地址(16進制)屏箍;3、把空間的地址賦值給變量;所以n存儲的是一個引用地址橘忱,并不是一個具體的值![Alt text](./1513571080711.png)###&&邏輯與||邏輯或- 在條件判斷中&&:所有都為真赴魁,才是真||:只要一個為真,就是真- 在賦值操作中||: a||b;看a的真假钝诚,a為真颖御,則返回a的值,a為假,則返回b,不管b是什么&&:a&&b, a為假潘拱,則返回a的值疹鳄,a為真,則返回b,不管b是什么真實項目中應(yīng)用邏輯或?qū)崿F(xiàn)默認值的設(shè)置操作邏輯與的優(yōu)先權(quán)高于邏輯或###JavaScript常用的操作語句>通過一系列的邏輯判斷芦岂,來完成特定的事情>for循環(huán)>if循環(huán):當(dāng)在判斷的操作中,很多條件都是符合的,執(zhí)行完成第一個符合的條件后,后面的條件不管是否符合都不在處理了####for in 循環(huán)@`用來遍歷(循環(huán))對象鍵值對的, '循環(huán)數(shù)組中的每一項', '條件瘪弓?條件成立執(zhí)行:條件不成執(zhí)行`;, 執(zhí)行步驟:]>key存儲的值都是字符串格式禽最,key中存的是屬性名>在for in 循環(huán)遍歷時腺怯,大部分瀏覽器都是先把對象中的鍵值對進行排序(整數(shù)數(shù)字在前,由小到大川无,其余按原來編寫順序排列)(小數(shù)算作字母呛占,不算數(shù)字)>`for in循環(huán)會遍歷對象原型上的方法`> itin [Tab] for in 循環(huán)快捷鍵####三元運算符>@`['條件?條件成立執(zhí)行:條件不成執(zhí)行懦趋;]`是簡單的if晾虑、else的另外一種寫法>如果某種情況并不需要做處理,我們可以用null,undefined,void 0占位即可>某一情況執(zhí)行多條操作仅叫,使用()包起來帜篇,每一項處理的事情之間用逗號分隔>在三元運算符中不能出現(xiàn)==break/continue/return== 會出現(xiàn) SyntaxErrorr 語法錯誤####switch case>也是if else某種特定情況的簡寫,可以在switch 語句中使用任何數(shù)據(jù)類型(在很多其他語言中只能使用數(shù)值)惑芭,無論是字符串坠狡,還是對象都沒有問題。其次遂跟,每個 case 的值不一定是常量逃沿,可以是變量,甚至是表達式幻锁。>每一種case情況結(jié)束都需要加break凯亮,達到條件成立處理完成,跳出當(dāng)前判斷`每一種case情況的比較都是使用===進行比較的:絕對相等``=:賦值哄尔,變量=值``==:比較假消,值==值``絕對比較,值===`如果左右兩邊比較的值是相同類型的岭接,那么直接比較內(nèi)容是否一樣即可富拗;如果兩邊值的類型不一樣,`==和===是有區(qū)別的`:===類型不一樣鸣戴,最后的結(jié)果就是false啃沪,更加的嚴謹 ==類型不一樣,瀏覽器首先會默認的把類型轉(zhuǎn)化為一樣的窄锅,然后再比較內(nèi)容创千,相對松散一些####for循環(huán)語句`for(初始值;驗證條件;步長累加){ 循環(huán)體}`@[執(zhí)行步驟:]>設(shè)置初始值>驗證條件>條件成立執(zhí)行循環(huán)體,否則推出循環(huán)>步長累加>驗證條件>···············>沒有步長累加會陷入死循環(huán)`for循環(huán)與for in循環(huán)的區(qū)別:for in 循環(huán)可以遍歷到原型上的公有屬性,而for循環(huán)只能遍歷私有的屬性`騰訊面試題```1.for(var i=0;i<10;i+=2){2. if(i<=5){3. i++;4. continue;5. }else{6. i--;7. break;8. }9. console.log(i);10.}11.console.log(i); //=>5```