js筆記

第一章1,什么叫程序:程序就是計算機按照人類完成事物的步驟和邏輯,通過計算機命令來逐步執(zhí)行最終實現(xiàn)目標的一種機器語言。程序語言最大的特點:1,輸入數(shù)據(jù),2,處理數(shù)據(jù),3,輸出數(shù)據(jù)。javascript簡介:1,概述:javascript簡稱js,這是一種典型的基于瀏覽器運營環(huán)境進行運行的一種程序腳本語言。什么叫基于瀏覽器運營環(huán)境:這種語言可以直接被瀏覽器解釋執(zhí)行出來。腳本:程序一經(jīng)寫定,一旦調(diào)用就直接執(zhí)行。js能做什么?1,用戶交互。什么叫用戶交互:用戶輸入數(shù)據(jù),計算機處理并反饋結(jié)果。2,頁面端的驗證處理頁面端驗證:就是在頁面上能夠看到信息輸入的規(guī)則,并且直接能看到驗證后的處理結(jié)果。3,頁面端運算處理在頁面能看到參與運算的數(shù)據(jù),并且能直接得到運算后的結(jié)果。前端的運算和驗證處理,能夠最大程度的減輕服務(wù)器壓力。同時提高了處理的速度,提升了用戶的體驗。4,制作特效。用替代Flash實現(xiàn)頁面特效。5,用戶實現(xiàn)前后臺數(shù)據(jù)傳遞。js的基本組成部分:1,基本核心語法:ECMAscript 我們現(xiàn)在學習的時5.0版本的。es5;es6就是ECMAscript的6.0版本;2,利用js操作HTML 的DOM方法。//DOM對象3,操作瀏覽器插件的BOM方法。//BOM 對象js的運行環(huán)境:一,在HTML頁面內(nèi)運行1, 輸入js語言

2,在HTML標簽內(nèi)直接輸入:3,直接建立js文件,在里面寫js語法。通過直接加以引用。二,就是在瀏覽器的運行環(huán)境內(nèi)直接運行。就時瀏覽器的控制臺內(nèi)。js的數(shù)據(jù)輸出方法:1,在頁面上寫出:document.write("");document//指的就是我們的文檔頁面即html--->document是所有在瀏覽器內(nèi)顯示的文檔統(tǒng)稱,HTML僅僅是其中的一種。2,在瀏覽器內(nèi)彈出信息:window.alert("");window//瀏覽器,document是屬于window的一部分。alert是彈出的意思。3,在控制臺直接打印輸出:console.log("");console//瀏覽器運行環(huán)境的控制臺。log打印輸出的意思。上述語法中的“.”是指什么什么的 什么什么的在同一個頁面上window.alert()比document.write()優(yōu)先執(zhí)行,并且阻斷程序的繼續(xù)執(zhí)行。------重點記憶js的特點:1,js語言可以使用任何的頁面編輯器進行編寫2,js語言不需要安裝運行環(huán)境,既可以通過瀏覽器自帶的js解釋器直接執(zhí)行3,js是一種弱類型語言。4,js是一種基于對象的前端程序語言。(暫時這么寫。)js基本語法:所有的js語句都是由js表達式,關(guān)鍵字,運算符組合起來的。所有的js語法嚴格區(qū)分大小寫。所有的js語句結(jié)束必須換行或者以分號結(jié)束。js的注釋語法://代表單行注釋。/*多行注釋*/運算符:加減乘除,大于號,小于號都屬于運算符。一切代表運算符號的都是運算符。關(guān)鍵字:方法名稱,變量名稱,對象名稱,數(shù)組名稱一切名稱都是關(guān)鍵字。表達式:以關(guān)鍵詞結(jié)合運算符形成一句代碼叫做表達式,表達式一定有結(jié)果產(chǎn)生。語句:由表達式結(jié)合基本語法形成多行代碼叫做語句。變量:概念:在內(nèi)存中直接開辟一個空間用來存放所需要的任意數(shù)據(jù)。優(yōu)點:變量空間內(nèi)的值可以隨意更改,這樣就實現(xiàn)了內(nèi)存的靈活使用。變量的基本語法:變量的聲明:var? 變量的名稱num 變量的賦值符號“=”變量的值:12;var num=12;這就是一個變量的創(chuàng)建。創(chuàng)建變量等于在內(nèi)存開辟空間。看到一個var就開辟一個空間。變量的名稱就是給空間起名,變量的值就是往空間內(nèi)存儲數(shù)據(jù)。不同的變量,命名可以同名,但是同名的變量輸出以最新的變量結(jié)果輸出。var a=12;vara=13;console.log(a);//13;console.log(a);//13同一個變量,變量可以重復賦值,最后的輸出以最新的值為準。var a=12;a=13;console.log(a);//13;console.log(a);//13變量的命名規(guī)則:1,不許數(shù)字在前,可以字母,$,%做第一個名稱。2,如果出現(xiàn)兩個單詞拼成一個變量名稱,中間不許使用-連接,必須兩個單詞靠在一起,每一個單詞的首字母大寫叫做:大駝峰命名法。第一個單詞小寫,后面的單詞首字母大寫叫做:小駝峰命名法。3.所起名字不許和js程序中的標準關(guān)鍵字,保留關(guān)鍵詞重名。標準關(guān)鍵字break? case? catch? continue? deflault? delete? do? else? false? finallyor? function? if? in? instanceof? new? null? return? switch? this? thow? true? try? typeof? var? with? undefined保留字 abstract? enum? int? short? boolean? export? interface? staticbyte? extends? long? super? char? final? native? synchronized class? float? package? throws? const? goto? private? transientdebugger? implements? protected? volatile? double? importpublic變量的傳值:var a=13;var b=a;變量的傳值,將一個變量a的值復制一次,粘貼給變量b,所以b的結(jié)果為:13;變量的使用:直接使用變量的名稱就是直接使用變量的值。直接使用變量名稱不用添加引號var c="中國";console.log(c);常量:常量就是一個固定的值。在ES5版本里面,常量的表示方法:PI=3.14;ES6版本里面,常量的聲明:const PI=3.14;在常量中,一般常量的名稱采用大寫的字母表示。數(shù)據(jù)類型:計算機將世界上全部的數(shù)據(jù)以及數(shù)據(jù)出現(xiàn)的錯誤的狀態(tài)都統(tǒng)統(tǒng)通過數(shù)據(jù)類型來加以存儲和識別。基礎(chǔ)數(shù)據(jù)類型/原始數(shù)據(jù)類型:undefined,定義了變量名,但是沒有賦值。undefined ---》未賦值,未定義。null;--》空的,沒有的。在對象中,null代表的是為空的對象string:--》字符串---》引號下所有的內(nèi)容均為字符串。在內(nèi)存每個字符都占兩個字節(jié)數(shù)。number:--》數(shù)字類型包含了:整數(shù),小數(shù)。整數(shù)在內(nèi)存中:占4個字節(jié)數(shù),小數(shù)占據(jù):8個字節(jié)數(shù)Boolean:--》只有兩個結(jié)果true,false這些數(shù)據(jù)類型都是存儲在棧內(nèi)存中的。棧內(nèi)存:就是我們?nèi)藶樵趦?nèi)存中開辟的一塊內(nèi)存空間,這部分空間內(nèi)存儲的是程序中最小的基本數(shù)據(jù)類型,而且經(jīng)常性的頻繁使用,棧內(nèi)存中存放的都是基礎(chǔ)數(shù)據(jù)類型和所有數(shù)據(jù)類型的名稱。那么棧內(nèi)存會引申出來一個堆內(nèi)存。堆內(nèi)存 :主要是存放:不經(jīng)常使用,但是代碼量很大的數(shù)據(jù)。這種數(shù)據(jù)我們一般一分為二兩部分存儲。將數(shù)據(jù)的名字存放在棧內(nèi),將數(shù)據(jù)的代碼主體存放在堆內(nèi)。中間以路徑的形態(tài)連接起來。這種需要通過路徑形態(tài)進行數(shù)據(jù)調(diào)用的數(shù)據(jù)類型被稱為引用數(shù)據(jù)類型。js中常見的數(shù)據(jù)類型:object對象類型,array數(shù)組類型,function函數(shù)類型引用數(shù)據(jù)類型的值傳遞:不是復制值進行粘貼,而是直接復制堆內(nèi)數(shù)據(jù)的(鏈接路徑)重新鏈接到棧內(nèi)的新名稱上。凡是從網(wǎng)頁上獲取的數(shù)據(jù)統(tǒng)統(tǒng)都是string類型。***typeof()//進行數(shù)據(jù)類型判斷的方法。具體的用法:將我們要判斷的目標,直接寫在typeof的圓括號內(nèi)。var a="hello";var res=typeof(a);//我們這個方法得到結(jié)果顯示的都是數(shù)據(jù)類型名稱。例如:string類型,number類型,null類型,undefined類型,boolean類型,(字符串)? (數(shù)字)(空值)(只有名字沒有值)boolean類型。object類型(對象類型/引用類型)。(對錯值)console.log(res);? console.log(typeof(a));簡寫isNaN(c)//返回的結(jié)果是對錯的判斷標準。第二章數(shù)據(jù)的運算:說直白點:就是利用數(shù)學的運算方式來對我們變量中存儲的數(shù)據(jù)進行:計算,對比,條件設(shè)置,賦值等處理運算所使用的符號叫做運算符:運算符分為:算術(shù)運算符,關(guān)系運算符,邏輯運算符,賦值運算符,三目運算;算術(shù)運算符:加號:+:當+號在運算中遇到字符串,加號變成拼接符,所有數(shù)據(jù)類型都變成字符串;當布爾值參與數(shù)字相加的時候,布爾值自動轉(zhuǎn)化為數(shù)字,true=1;false=0;var a=10;var b="12";var c=a+b;console.log(c)//1012console.log(typeof(c))//stringvar a=true;var b=false;var c=a+b//1,數(shù)據(jù)類型:number。減號:-;當數(shù)字與數(shù)字類型的字符串進行減法運算的時候,計算機先強制將數(shù)字類型字符串轉(zhuǎn)變位數(shù)字在參與計算。得到結(jié)果是一個number類型。var a=10;var b="12";var c=a-b;console.log(c)//-2console.log(typeof(c))//numbervar a=10;var b="12a";var c=a-b;console.log(c);//NaNconsole.log(typeof(c));//number所有的數(shù)據(jù)類型在參與減法運算中,都會被強制轉(zhuǎn)化為數(shù)字,在參與計算。當非數(shù)字字符串參與減法運算,結(jié)果出現(xiàn)NaN。乘號:*一切乘法運算中,先把數(shù)據(jù)類型轉(zhuǎn)化為數(shù)字,然后相乘。當非數(shù)字字符串參與乘法運算得到NaN結(jié)果。當我們遇到NaN數(shù)據(jù)的時候,我們不能直接使用typeof()進行判斷,而是需要isNaN()進行判斷,判斷的結(jié)果是:TRUE或者FALSE在我們做算術(shù)運算中,如果出現(xiàn)小數(shù)的加減乘除運算的時候,出現(xiàn)小數(shù)點后的取值出現(xiàn)誤差,這樣的誤差叫做舍入誤差。解決方案:c.toFixed(2);意思是將變量c的結(jié)果取小數(shù)點后兩位數(shù),并且自動四舍五入。例如:var c=1.2-0.5;//0.7000000001;c.toFixed(2)//0.70;除法:/,所有的數(shù)據(jù)先轉(zhuǎn)化為數(shù)字類型,然后參與相除,1除以0//infinity,無窮大。、求模運算:a%bvar a=123;var b=10;var c=a%b;c的結(jié)果是123除以10之后所剩余的量。結(jié)果為3.所以求模運算就是一種取除法中的余數(shù)運算。自增運算:var a=10;console.log(a+a++);a++在運算中先參與運算在第二步運算的時候才開始加1; a + a++=10+10=20//這個時候的a++必須等待第三個a出來才會讓第三個a+1;a++ +a =10+11=21//此時a++參與第一步運算,遇到第二a,所以他將加1之后的值賦給了第二個a.練習作業(yè):var a=2;var b=3;a+b++ +a++ +b=?在自增運算中,n++和++n的區(qū)別是什么?n++是先運算后自加,只有公式中出現(xiàn)第二個n才會講增加的1賦值給第二個n上。++n是先自加后運算。在不參與運算的情況下,n++,與++n的值是一樣的。計算機的計算順序:1,先算括號內(nèi),2,再算乘除,3,算加減var a=1;var b=2;var c=3;(a++*++a -++b)/++c=?關(guān)系運算符:其實就是求幾個數(shù)據(jù)之間的大小關(guān)系。有大于>,小于<大于等于>=小于等于<===等于===絕對等于!=不等于;關(guān)系運算結(jié)果返回的是一個boolean值,只有true或者false;面試題:==和===的區(qū)別。==是先進行數(shù)據(jù)類型轉(zhuǎn)化,然后再比較是否相等。===是不進行數(shù)據(jù)類型轉(zhuǎn)化,直接比較,更加嚴格一些、在關(guān)系運算中,一切數(shù)據(jù)類型遇到數(shù)字,都先轉(zhuǎn)化為數(shù)字再對比。如果無法轉(zhuǎn)化為數(shù)字,就會出現(xiàn)false結(jié)果再字符串的關(guān)系對比中,按照大小順序是根據(jù)Unicode編碼順序來進行的。A-Z之間的Unicode編碼順序:65-90;a-z之間的unciode編碼順序:97-122;0-9之間的順序:48-57;漢字的Unicode編碼順序:u4e00-9fa05邏輯運算:其實就是設(shè)置運算的條件,有“與”“或”“非”三種var a=prompt("請輸入數(shù)字")if(!(a>70)){//邏輯非運算,凡是小于等于70才成立alert("你好");}if(a>70||a>90){//邏輯或運算,多個條件滿足其一即可alert("你好");}if(a>70&&a<90){//邏輯與運算。多個條件必須同時滿足才行。alert("你好");}賦值符運算:賦值運算 =? +=? -=? *=? /=? %=等號:將等號右側(cè)的內(nèi)容賦值給左側(cè)的名字。+=:str+=5;str=str+5 //此時返回的結(jié)果是11面試題:var str="hello";var str=str+"world";創(chuàng)建了幾個變量?標準答案:3個;解析過程:因為字符串變量一旦創(chuàng)建,空間不可改變,所以為了容納helloworld,我們必須創(chuàng)建一個新變量他的值就是helloworld。加上之前的hello變量和world變量,總共是3個。條件三目運算:其實就是一個條件判斷運算。其中語法包含:條件?“條件成立執(zhí)行的結(jié)果”:“條件不成立執(zhí)行的結(jié)果”數(shù)據(jù)類型的轉(zhuǎn)化:隱式轉(zhuǎn)化:在數(shù)據(jù)運算中,js程序自動根據(jù)運算的環(huán)境,對數(shù)據(jù)類型進行自動轉(zhuǎn)化,例如在加運算中,所有數(shù)據(jù)遇到字符串,都會變成字符串,在關(guān)系運算中,所有數(shù)據(jù)遇到number都會轉(zhuǎn)變成number類型。這樣的轉(zhuǎn)化被稱為隱式轉(zhuǎn)化。隱式轉(zhuǎn)化:會自動根據(jù)環(huán)境進行轉(zhuǎn)化,不需要人工操作,缺點:轉(zhuǎn)化不可控為了能夠讓數(shù)據(jù)的使用可控,我們需要能夠?qū)?shù)據(jù)轉(zhuǎn)化人為可控制。這種需要人為轉(zhuǎn)化的:我們稱為顯式轉(zhuǎn)化或者強制轉(zhuǎn)化。強制轉(zhuǎn)化就需要我們使用相應(yīng)的數(shù)據(jù)類型轉(zhuǎn)化的方法;1,所有數(shù)據(jù)變成string類型:方法1,String(“內(nèi)容”);常用方法2,x.toString();2, 所有數(shù)據(jù)轉(zhuǎn)化為number類型:方法1:Number(x);//將所有數(shù)據(jù)轉(zhuǎn)化為number類型,如果遇到非數(shù)字類型轉(zhuǎn)化結(jié)果為:NaN;帶有小數(shù)點的數(shù)字內(nèi)容直接轉(zhuǎn)化為小數(shù)。方法2:parseInt(x);將所有數(shù)據(jù)轉(zhuǎn)化為整數(shù)。遇到數(shù)字在前,文字內(nèi)容在后的,該方法直接讀取能夠讀到的數(shù)字部分轉(zhuǎn)化為整數(shù)。,小數(shù)只顯示整數(shù)部分方法3:parseFloat(x);將所有數(shù)據(jù)讀取出來,如果有小數(shù)將顯示小數(shù)內(nèi)容。總結(jié):parseInt(),parseFloat(),只是將字符串string轉(zhuǎn)化為數(shù)字類型number,所以在上述兩種方法中。圓括號內(nèi)如果直接寫內(nèi)容就必須加雙/單引號。練習:做一個超市的收銀程序:1,工作流程:3,Boolean(x)//將所有數(shù)據(jù)類型轉(zhuǎn)化為布爾值。除了,null,undefined,""空字符,0,false這些返回結(jié)果是false之外,其他都是返回true。第三章控制語句:我們已經(jīng)學習了常變量來存儲數(shù)據(jù),學了數(shù)據(jù)類型來區(qū)分數(shù)據(jù),學了運算符來計算數(shù)據(jù),轉(zhuǎn)化方法來轉(zhuǎn)化需要的數(shù)據(jù)。但是我們獲得數(shù)據(jù)之后怎么做。這就是我們學習控制語句的主要意義。? ? 控制語句就相當于我們在日常生活中說話的語法控制語句分為兩大類:? ? 分支控制語句和循環(huán)語句。? ? 分支語句:1,if(條件成立?){寫出條件成立執(zhí)行的命令}2,if(條件成立){執(zhí)行條件成立的命令}else{執(zhí)行其他的命令。}練習題:超市購物,計算結(jié)果之后,根據(jù)你給的錢做判斷,確定你是應(yīng)該找零還是應(yīng)該補錢。練習題:1,寫出五個檔次的評價:優(yōu)秀,良好,及格,不及格,弱爆了。2,自己制定一個10人的成績單,3,輸入任一學員名稱,給出分數(shù),并且給出評價。我們學習的if(){}else if(){}else{}這種條件判斷是先判斷條件。再執(zhí)行結(jié)果。switch(){case 1:執(zhí)行結(jié)果;}var a=prompt();switch(true){//圓括號內(nèi)填寫的是一個表達式。作為結(jié)果case a>90://冒號前面寫上當前的條件判斷,如果條件判斷等于switch圓括號中的結(jié)果,執(zhí)行命令。console.log("優(yōu)秀");break;//執(zhí)行完命令之后,跳出當前程序。case a>80:console.log("良好");break;case a>60:console.log("及格");break;default :console.log("不及格");break;}循環(huán)控制語句:? 循環(huán)分三部分:1,循環(huán)變量;就是隨著循環(huán)執(zhí)行的命令逐次在增加或者減少的一個變量。2,循環(huán)條件。滿足程序一直在循環(huán)執(zhí)行的一個條件設(shè)置。3,循環(huán)執(zhí)行的程序內(nèi)容:我們稱為循環(huán)體var th=null;while(th<(yfmoney-sfmoney)){th=parseFloat(prompt("請輸入退貨金額"));yfmoney=yfmoney-th;}while循環(huán)的特點是:先判斷條件,然后再執(zhí)行循環(huán)。do{}while()執(zhí)行在前,判斷在后。先執(zhí)行一次程序,然后根據(jù)條件判斷是否后續(xù)繼續(xù)執(zhí)行。do{} while();是先執(zhí)行后判斷,while(){}是先判斷再執(zhí)行。for循環(huán)。基本語法:for( var i=0;i<10;i++ ){循環(huán)體內(nèi)容。}作業(yè):利用while循環(huán)輸出“*”打印出一個三角形。for循環(huán)是一種經(jīng)常用作已知上限的有限循環(huán)。while經(jīng)常用來做未知上限的條件循環(huán)。在switch? case中我們學習了break;跳出程序,阻斷程序執(zhí)行。但是當我們需要僅僅是跳出當前這一步,后面的繼續(xù)執(zhí)行,我們就需要用到continue;語法使用:for(var n=1;n<=100;n++){if(n==10){continue;}console.log(n)}輸出的結(jié)果就會跳出10,繼續(xù)執(zhí)行下一步。作業(yè):打印出九九乘法表,凡是乘數(shù)中有奇數(shù)存在,則不輸出當前公式,繼續(xù)輸出下一步。奇數(shù)的判斷標準:不能被2 整除的數(shù)為奇數(shù)。第四章1,函數(shù)/方法:就像變量擁有自己的聲明一樣,函數(shù)也擁有自己的類聲明。function 就是一個類聲明,函數(shù)/方法是一個典型的引用數(shù)據(jù)類型函數(shù)的基本語法是:聲明:function 名字aa()//參數(shù)列表{//方法 }創(chuàng)建函數(shù):有兩種創(chuàng)建方法:1,使用類聲明直接創(chuàng)建:function aa(){};//聲明及值提前2,使用直接量創(chuàng)建;var aa=function (){};函數(shù)的使用:調(diào)用函數(shù)的名稱aa()//返回的是:函數(shù)花括號內(nèi)的程序過程或者結(jié)果值如果直接使用函數(shù)名稱本身aa的話,輸出的結(jié)果就是整個函數(shù)本體。如果調(diào)用函數(shù)的名稱加上參數(shù)列表:aa()那么輸出的結(jié)果就是函數(shù)方法體內(nèi)的程序執(zhí)行結(jié)果。函數(shù)的定義:我們稱之為方法:它是一個封裝了一段代碼過程的容器。方法一般輸出的結(jié)果有兩大類:1,程序執(zhí)行的過程,2,程序算出的結(jié)果值函數(shù)聲明:function 名字aa()//參數(shù)列表{//方法體:封裝需要重復執(zhí)行的代碼 }函數(shù)的變量:函數(shù)的全局變量//寫在函數(shù)之外的變量稱為全局變量,函數(shù)的參數(shù)變量//在函數(shù)的參數(shù)列表寫的變量,函數(shù)的局部變量//在函數(shù)的方法體內(nèi)聲明的變量稱為局部變量。函數(shù)變量執(zhí)行的優(yōu)先級別是什么?如果同時存在相同變量名稱,那么輸出的變量順序是:局部變量優(yōu)先,參數(shù)變量在中間,最后是全局變量。局部變量的結(jié)果輸出:需要使用return命令實現(xiàn)。return的意思是返回。function a(){var c=100;return c;}console.log(a());//輸出的結(jié)果是100;什么情況下使用return:? 如果我們該函數(shù)的目的不是利用函數(shù)體內(nèi)的程序過程,而是利用程序執(zhí)行之后的一個結(jié)果,那么我們就需要在方法體? 的底部使用return 后面跟我們需要使用的結(jié)果代碼return是一次返回一個結(jié)果值。函數(shù)的參數(shù):什么叫函數(shù)的參數(shù)?function aa(name,age){};凡是寫在函數(shù)名稱后方圓括號內(nèi)的變量或者數(shù)據(jù)都是函數(shù)的參數(shù)/叫做方法的參數(shù)。備注:在我們以后所學程序中,我們經(jīng)常會遇到 afc();這就是一個方法。凡是寫在方法圓括號內(nèi)的數(shù)據(jù),都叫參數(shù)。參數(shù)分為:“形參”和“實參“兩種。形參是一種形式的參數(shù),不代表具體的內(nèi)容。實參是一種代表了具體事物的內(nèi)容。我們可以把形參看做參數(shù)變量的名稱,實參看做參數(shù)變量的值。所以實參實際上實在給形參賦值,賦值的過程叫做函數(shù)的傳參。在方法內(nèi),形參是不需要添加引號的,多個形參中間以逗號隔開。但是我們在調(diào)用方法的時候,在參數(shù)列表內(nèi)添加一個實例化的參數(shù),此時該參數(shù)為實參,實參如果是字符串,需要添加引號名詞解釋:實例化就是將一個形參寫出一個實際的參數(shù),這叫做實例化。初始化:如果我們新建一個變量或者方法,就直接寫一個值作為默認存在的,就叫做初始化。function aa(name1,age1){//name1是形參,并且做局部變量name的值var name=name1;//局部變量var age=age1;document.write("我的名字是"+name+",我的年齡"+age);}aa("朱克澤",21);//朱克澤就是name1的實參。函數(shù)內(nèi)調(diào)用函數(shù):就是我們創(chuàng)建了幾個基礎(chǔ)函數(shù),并且將這幾個基礎(chǔ)函數(shù)的結(jié)果直接調(diào)用在一個綜合函數(shù)內(nèi)。例如://函數(shù)Afunction A(a){var num1=a;return num1;}//函數(shù)Bfunction B(b){var num2=b;return num2;}//函數(shù)Cfunction c(){var num3=A(1)+B(2);return num3;}console.log(c())//函數(shù)Cfunction c(f,e){var num3=A(f)+B(e);return num3;}console.log(c(3,5))內(nèi)存的清理機制:引用數(shù)據(jù)類型的名稱和路徑直接存儲在棧內(nèi)存的。引用的數(shù)據(jù)類型主體是存儲在堆內(nèi)存的,他們之間是通過路徑的方法加以調(diào)用。這個時候,計算機為保證內(nèi)存的空間得到合理利用,會定期清理不用的代碼段。ie瀏覽器判斷的標準是:賦予每個代碼段一定的使用次數(shù),如果次數(shù)沒有了則視為垃圾予以清除。非IE瀏覽器則根據(jù)代碼的調(diào)用路徑數(shù)量來判斷,如果沒有任何一個路徑指向該代碼。則視為垃圾予以清除。function 的值傳遞:在js中,所有的值發(fā)生重新賦值的時候都是按值傳遞。在引用類型中,發(fā)生的值傳遞都是值的路徑進行改變的。function 的作用:1,封裝代碼段實現(xiàn)程序的重復調(diào)用。2,函數(shù)之間的調(diào)用本質(zhì)上是一種數(shù)據(jù)的傳遞。1,函數(shù)的創(chuàng)建方法:1,聲明創(chuàng)建。2,直接量創(chuàng)建2,函數(shù)的調(diào)用方法:函數(shù)名稱+();直接使用函數(shù)的名稱相當于打印整個函數(shù)3,函數(shù)的變量:1,全局,2,局部,3,參數(shù)變量。優(yōu)先執(zhí)行的順序是:2>3>1,作于范圍:1>3>24,形參和實參,傳參。5,函數(shù)內(nèi)調(diào)用函數(shù)6,按值傳遞7,聲明提前。面試題:聲明提前:1,什么叫聲明提前:當計算機在讀取程序的時候,首先計算機會先預(yù)覽全部程序,將變量var ,function同時提升到程序的最前方,優(yōu)先執(zhí)行。2,變量聲明提前和函數(shù)聲明提前的區(qū)別?1,變量聲明提前只提前聲明及名稱,不提前值。2,函數(shù)聲明提前是聲明,名稱及值同時提前。使用類聲明直接創(chuàng)建的才會出現(xiàn)聲明提前現(xiàn)象。第五章1,數(shù)組的概念:數(shù)組是一種空間,主要是用來存儲批量數(shù)據(jù)的空間。2,數(shù)組的語法:var a=[1,2,3];//使用直接量創(chuàng)建數(shù)組數(shù)組的名稱:a數(shù)組的元素:1 2? 3數(shù)組中排第一位的序號是:0,那么0這種序號被稱為數(shù)組的下標號。 var arr=[1,2,3,4];

//alert(arr[0]);//數(shù)組元素的讀取,利用數(shù)組的名稱[數(shù)組元素的下標號]來讀取元素

//數(shù)組元素的添加,就是利用數(shù)組的下標號來進行賦值的方式添加或者修改

arr[3]=12;

console.log(arr);

3,數(shù)組的元素類型:在同一個數(shù)組中,元素的數(shù)據(jù)類型可以是不一樣的。數(shù)組內(nèi)的元素也可以是數(shù)組。4,數(shù)組長度的獲取:length語法:arr.length//返回的結(jié)果是一個統(tǒng)計了數(shù)組中元素的數(shù)量。練習:輸出數(shù)組中所有的元素。5,無序的數(shù)組,但是我們需要得到一個從小到大的數(shù)組。冒泡排序:var arr=[5,2,9,8,1,7,6,3,4];\冒泡排序?qū)嶋H上就是一種按照從小到大的順序排列數(shù)組元素的。一幫常用語數(shù)字類型的數(shù)組。冒泡排序的原理,就是使用兩個for循環(huán)從同一個數(shù)組中任意取出一個元素進行大小對比,通過值的轉(zhuǎn)換,將小的元素排在大的元素之前。代碼如下:var arr=[5,2,9,8,1,7,6,3,4];for(var i=0;iarr[j]){var c=arr[j];arr[j]=arr[i];arr[i]=c;}}}console.log(arr);數(shù)組中的內(nèi)置方法:數(shù)組的底部插入和底部刪除。push(元素,元素);數(shù)組名稱.push(元素,元素);//這種方法是在數(shù)組的尾部自動增加元素,無法修改元素。和數(shù)組名稱[i]="元素";//一次添加一個元素,但是可以修改已經(jīng)存在的元素。arr.pop();在數(shù)組的底部取出元素。圓括號內(nèi)沒有參數(shù),默認為取出數(shù)組中最后的一個元素。如果我們需要連續(xù)刪除每個元素從后面往前刪除的話,我們需要結(jié)合循環(huán)進行刪除。棧存儲,同時使用push,pop兩種方法對數(shù)組進行修改的,我們將這種數(shù)據(jù)修改稱為棧存儲。表現(xiàn)出來的數(shù)據(jù)存儲順序為后進,先出? 在數(shù)組的頭部刪除或者插入元素,在頭部刪除:arr.shift()面試題:寫出pop(),push(),shift(),unshift()的作用和區(qū)別。練習題:總共15張票,排在奇數(shù)位的人都選擇放棄買票。那么你的排位是32,請問你能否買到票。如果能買到,你是第幾個買到票,如果不能你應(yīng)該排在第幾位。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? arr.sort(自定義排序規(guī)則);sort排序是根據(jù)Unicode編碼進行升序排列。所以直接利用sort排序無法解決9以上數(shù)字的排序。此時我們就需要對sort排序進行自定義排序規(guī)則var arr=[3,4,1,5,2,8,6,9,7,12,15,35];arr.sort(function(a,b){return a-b;});document.write(arr);//sort排序中的自定義排序,只能對數(shù)字類型進行排序。//如果對字符串進行排序直接使用sort()方法即可。回調(diào)函數(shù):直接寫在方法圓括號內(nèi)的函數(shù)被稱為回調(diào)函數(shù)。其他的數(shù)組預(yù)定義方法:數(shù)組拼接:concat();這個拼接和push()的區(qū)別是:arr.concat(元素)是將原來數(shù)組arr和新添加的元素拼接形成新數(shù)組,老數(shù)組就需要手動清空。push();是在原數(shù)組基礎(chǔ)上進行元素 內(nèi)容添加修改。var arr=[1,2,3,4,5];arr=arr.concat(6,7);console.log(arr);//手動清空原數(shù)組 var arr=[1,2,3,4,5];var b=arr.concat(6,7);console.log(b)arr=null;join()合并;var arr=[1,2,3,4,5];arr=arr.concat(6,7);console.log(arr);console.log(arr.join());//不加雙引號,代表將數(shù)組中的全部元素輸出console.log(arr.join(""));//增加了雙引號,代表將元素拼接在一起輸出。截取:slice(start,end):slice()截取在內(nèi)存變化中,實際上在原數(shù)組基礎(chǔ)上,將截取的新元素重新創(chuàng)建一個新數(shù)組出來。老的數(shù)組如果不用就手動清楚,清空內(nèi)存。slice截取元素依靠元素的下標來實現(xiàn)截取的范圍。start是指開始的那個元素的下標號,end是所需截取的最后一個元素的下一位元素的下標。var arr=[1,2,3,4,5,6,7,8,9];arr.slice(1,3);//所截取的數(shù)組是[2,3];var arr=[1,2,3,4,5];arr=arr.concat(6,7);console.log(arr);console.log(arr.join());//不加雙引號,代表將數(shù)組中的全部元素輸出console.log(arr.join("!"));//增加了雙引號,代表將元素拼接在一起輸出。console.log(arr.slice(0,4));//新建一個新的子數(shù)組,原來的老數(shù)組依然存在。console.log(arr);console.log(arr.toString(""));//和join的相同點和區(qū)別點://join(“”)相當于將每個元素轉(zhuǎn)化為字符串并且拼接起來。join();直接將數(shù)組轉(zhuǎn)化為字符輸出不拼接。//arr.toString()加不加雙引號都是直接將數(shù)組轉(zhuǎn)化為字符串輸出,不拼接。以上的數(shù)組方法均為內(nèi)置方法:廠家已經(jīng)定義好的方法我們直接使用就可以實現(xiàn)效果的。需要我們自己一個代碼處理過程的程序,這樣的方法叫做自定義方法。console.log(arr.slice(1,))//從第二位開始,一直到數(shù)組的最后一個元素全部截取。function slice(a,b){var arr=[1,2,3,4,5,6];var c=[];for(var i=a;i");//求多個值中最小的一個。

//隨機數(shù)random();返回的是一個從0-1的隨機數(shù)。

document.write(Math.random())

//50-100random()*50+50求出隨機數(shù)生成的數(shù)字范圍random()*(max-min)+min

練習作業(yè):

使用隨機數(shù)產(chǎn)生一個4位數(shù)驗證碼。驗證碼需要有數(shù)字和字母

Date日期對象:

概述:專門獲取計算機日期的一個對象。

日期對象的創(chuàng)建方法:

var dat=new Date();

var dat=new Date();//獲取的是計算機現(xiàn)行的時間

console.log(dat)

var mydat=new Date("2017/12/10 12:30");

console.log(mydat)//自定義時間

var pcdat=new Date(0);//得到的是計算機初始時間

console.log(pcdat)

get是獲取日期對象的某一個具體的時間點。

但是他不能修改日期對象。

如果我們需要一個能修改日期對象的方法:就需要一個set();

例如我們需要修改下時間的小時數(shù):

var dat=new Date();

dat.setHours(10);//此時運用set方法修改小時數(shù)為10

console.log(dat)//此時間已經(jīng)修改。

我們在Date()對象中獲取的時間差值,不僅僅是頁面上的一個顯示的內(nèi)容,而且是一個時間差的

毫秒數(shù),他在程序背后自動根據(jù)計算機的時間進度來前進。

所以我們說時間的進程變化不受到我們的頁面程序的影響。

var nowdate=new Date();

var futuredate=new Date("2017/12/28 17:30");

var time=futuredate-nowdate;

document.write(time/1000/60);

練習題:算出距離過年還有多少:天,小時,分鐘,秒的倒計時

第八章

1,function對象

function可以被稱為函數(shù)對象。

在前端開發(fā)過程中,我們經(jīng)常會遇到同名的函數(shù),這個時候我們傳參只能將參數(shù)傳遞給最新的函數(shù)

,js無法像Java這樣的后臺語言一樣去根據(jù)參數(shù)的個數(shù)和類型來識別給那個函數(shù)傳參。

為了解決這個問題,我們今天學習一個類數(shù)組類對象arguments來解決這個問題。

arguments:是函數(shù)對象創(chuàng)建的時候才會產(chǎn)生,指的就是function中的參數(shù)列表。

這是一種對象,但是具有數(shù)組的特點 ,所以被稱為類數(shù)組類對象。

特點:1,可以獲取對象的長度。有l(wèi)ength屬性

arguments.length獲得是實際參數(shù)所傳的實參個數(shù)。

2,可以根據(jù)下標號來查找參數(shù)。

arguments對象的主要作用:根據(jù)長度和數(shù)據(jù)類型判斷所傳數(shù)據(jù)是否為函數(shù)對象所需數(shù)據(jù)。

模擬Java中的函數(shù)重載。

函數(shù)的創(chuàng)建:

1,直接量創(chuàng)建: var aa=function(){

this//代表的是全局對象window

};

2,函數(shù)類聲明創(chuàng)建:function aa(){};

3,構(gòu)造函數(shù)創(chuàng)建:var aa=new Function()

在對象中 this//代表的是函數(shù)名:aa

匿名函數(shù):匿名函數(shù)的自調(diào),回調(diào);

匿名函數(shù):沒有命名的函數(shù) ,匿名函數(shù)的調(diào)用:(function(){})()//自調(diào);

將整個匿名函數(shù)放入方法的參數(shù)使用。例如sort(function(){})//回調(diào)函數(shù)。

閉包:

閉包的作用:防止全局變量的值污染。

因為js中變量var可以實現(xiàn)同名變量的創(chuàng)建,這樣會導致在后續(xù)的賦值過程中出現(xiàn)值的誤傳。

閉包實現(xiàn)的原理:

局部變量不會被外部所訪問。

代碼實例:

function cc(){

var n=10;

return function (){

return n+3;

}

}

n=100;//為了不被n=100的值污染,我們使用了閉包;

var c=cc();//cc()//function (){return n+3}//c=function (){return n+3}

console.log(cc())

document.write(c());//function (){return n++}

//var c=aa();//var c=function(){return n++}

//document.write(c());

閉包的三個特點:

1,存在內(nèi)環(huán)和外環(huán)兩個函數(shù)嵌套。

2,在內(nèi)環(huán)和外環(huán)之間存在一個局部變量。

3,內(nèi)環(huán)函數(shù)是一個匿名函數(shù)并且由外環(huán)函數(shù)return。

自定義對象:

對象:從代碼使用上來說。對象就是我們所要描述的目標,以及為了描述目標所封裝的屬性存儲,處理及運算方法,等統(tǒng)稱為對象。

從代碼表現(xiàn)上來說:對象實際就是一系列沒有序列的屬性和值的集合

自定義對象:開發(fā)人員根據(jù)需要自我定義的對象;

自定義對象的創(chuàng)建:

1,直接量創(chuàng)建:/原始對象;

var obj={

name:"tom",

age:21,

say:function(){this.name+this.age}

}

//缺點:原始對象主要是針對某一個實例來寫的,如果我們后續(xù)要多個實例創(chuàng)建,就需要重復創(chuàng)建。

2,為了縮減代碼,減少重復創(chuàng)建,我們使用工廠函數(shù)進行創(chuàng)建:

//工廠函數(shù)創(chuàng)建對象方式:

function stu(name,age,party,core){

var obj={};

obj.name=name;

obj.age=age;

obj.party=party;

obj.core=core;

obj.say=function(){

return this.name+this.age+this.party+this.core;

}

return obj;

}

//工廠函數(shù),就是使用常規(guī)函數(shù)包裝對象。通過不同值的傳遞,實現(xiàn)不同對象的輸出。規(guī)避了代碼的重復

//缺點:對于不同屬性的同名函數(shù),他無法識別函數(shù)的種類。

//構(gòu)造函數(shù)對象

function Obj(name,age,core){

this.name=name;

this.age=age;

this.core=core;

this.say=function(){

return this.name+this.age+this.core;

}

}

var first=new Obj("tim",21,75);

var first1=new Obj("tmm",28,65);

console.log(first.say());

//特點:可以規(guī)避代碼重復創(chuàng)建,同時清晰只想所傳參數(shù)的歸屬。

缺點:每次實例化傳參都等于在堆內(nèi)存中重新開辟空間,內(nèi)存的性能很差。

屬性的遍歷輸出:

對象的屬性遍歷輸出可以通過for in 循環(huán)的方式予以讀取。

對象的屬性值添加,通過 對象.屬性名=“屬性值”;的方式予以修改的。

對象["屬性名"]="屬性值"

對象屬性是否存在的判斷方法:

1,通過利用屬性名in對象的方式予以判斷,返回結(jié)果為:boolean值

2,通過hasOwnProperty()方法予以判斷

function stu(name,age,sex,core){

var obj=new Object();

obj.name=name;

obj.age=age;

obj.sex;

obj.core=core;

obj.say=function(){

}

return obj;

}

for(var key in stu()){

document.write(stu("tom",1,"男",45)[key]);

}//遍歷輸出

document.write("height" in stu())//屬性判斷

document.write(stu().hasOwnProperty("age"));//屬性判斷

document.write(stu().age===undefined);//屬性判斷

封裝:

原型:在js中,我們所有面向?qū)ο蠖际腔谠偷拿嫦驅(qū)ο蟆T途褪敲總€函數(shù)對象在創(chuàng)建的時候,都會有一個默認的屬性

prototype,該屬性數(shù)據(jù)類型是一個object類型,所以我們稱原型為原型對象。

原始對象沒有原型prototype.

原型獲取:

function B(){

this.name="tom";

}

console.log(B.prototype);//object

document.write(Object.getPrototypeOf(B))//function(){[native code]}

對象的原型直接全部復制對象的屬性和方法,對象改變,原型改變。如果原型改變了,對象不會被影響到。

練習作業(yè):

1,兩個對象A,B (代碼題)

實現(xiàn)a1繼承b1的身高

實現(xiàn)a1,a2,a3,統(tǒng)統(tǒng)繼承b1身高

如果只是通過原型繼承,第一題怎么做?

基礎(chǔ)題:繼承的三種方法代碼抄寫,及區(qū)別

預(yù)習:自有屬性,共有屬性,屬性的擴展,this關(guān)鍵詞的用法。

繼承:

使用繼承的原因,因我們在實際開發(fā)工作,我們將所有的方法都封裝為獨立的對象,那么獨立的對象如果

需要形成一個完整的程序,我們就需要在對象之間形成相互調(diào)用,這樣就需要使用繼承這一功能。

繼承的定義:對象A能夠直接使用對象B的屬性,這就叫做A繼承B;

繼承的方法:

1,A.prototype=new B();此時就實現(xiàn)了對象A對對象B的全面繼承。

主要表現(xiàn)在A的原型鏈指向B的原型

2,實現(xiàn)單一一個對象繼承另一個對象,不影響其他的同類對象。

Object.setPrototypeOf(子對象a,父對象的實例new B());

3,實現(xiàn)A對B的原型繼承:

A.prototype=B.prototype;//就是將B的原型直接賦值給A的原型,從而實現(xiàn)A對B的繼承。

對象和原型的關(guān)系

對象的改變會影響原型的改變。

原型的改變不會影響到對象。

共有屬性和自有屬性:

如果有一個父類B,和子類b,父類的所有屬性都會被子類b所繼承使用,那么父類的屬性被稱為共有屬性

如果子類中有一個自己獨特的屬性。那么這個屬性被稱為自有屬性。

父類無法使用子類的自有屬性。

子類可以直接使用父類的原型屬性/共有屬性。

給父類添加共有屬性/原型屬性的時候我們需要寫成 父類.prototype.屬性名=“屬性值”;

給子類添加自有屬性:子類.屬性名=“屬性值”

this關(guān)鍵詞:意思是替代指向;

在構(gòu)造函數(shù)中,對象中,this代表的是對象自身。

在常規(guī)函數(shù)中,this代表的全局對象window。

call()//參數(shù)第一個值里面放的是this,

apply()

以上兩種都是替代函數(shù),主要作用是 做對象指向的改變。參數(shù)的第一個為this,指的那個對象,第二個參數(shù)

call最多可以填寫兩個元素,做具體單一傳值。

apply()第二個參數(shù)是一個類數(shù)組類對象,里面可以包含一組元素。指向范圍更加廣闊一些。

function add(a,b)

{

alert(a+b);

}

function sub(a,b)

{

alert(a-b);

}

add.call(sub,3,1); //1,此時相當于我們將add替代了對象sub.,輸出sub直接使用是add的運算公式

輸出結(jié)果為4

sub(3,1)//2,但是如果我們單獨給sub對象提供參數(shù),sub依然是按照自己原有的公式計算結(jié)果

輸出結(jié)果為:2;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,199評論 0 13
  • js簡介 Js是一種基于事件和對象驅(qū)動的解釋性、松散性的語言。 一切皆對象 javascript 布蘭登艾奇 ...
    塔庫納瑪哈哈閱讀 1,233評論 0 2
  • 個人入門學習用筆記、不過多作為參考依據(jù)。如有錯誤歡迎斧正 目錄 簡書好像不支持錨點、復制搜索(反正也是寫給我自己看...
    kirito_song閱讀 2,500評論 1 37
  • 今天中午一個人在食堂吃飯,旁邊有個大一的妹子的父母和她一起吃,聽到他們聊天有點大聲,似乎是家長在教育妹子好好...
    Li亦維閱讀 221評論 0 1
  • 水菱:鏘鏘鏘~~又一篇新的拆書記錄誕生啦!喜歡畫畫的小伙伴越來越多,這一期的拆書主題應(yīng)運而生——修煉畫圖基本功~(...
    白一琳Elin閱讀 2,156評論 6 14