做BS系統(tǒng),JavaScript的使用是少不了的;本文就帶你快速回顧一下JavaScript的基本知識(shí),看看哪些基礎(chǔ)知識(shí)是你所遺漏的
① js是一種基于對(duì)象和事件的腳本語(yǔ)言,使用瀏覽器來(lái)執(zhí)行。
② js是解釋型語(yǔ)言,無(wú)需編譯就可隨時(shí)運(yùn)行。
③ 安全性:不允許訪問(wèn)本地硬盤(pán);跨平臺(tái):有支持js的瀏覽器即可。
④ 在網(wǎng)頁(yè)中編寫(xiě)js代碼推薦使用外部引用的方式,這樣可以多個(gè)頁(yè)面共享js代碼,達(dá)到代碼復(fù)用。
(1) 大小寫(xiě)敏感,嚴(yán)格區(qū)分大小寫(xiě)。
(2) 定義字符串,可以使用“雙引號(hào)”,也可使用“單引號(hào)”,推薦使用單引號(hào)與html避免沖突。
(3) js是“弱類(lèi)型”語(yǔ)言,支持“動(dòng)態(tài)類(lèi)型”,沒(méi)有顯示數(shù)據(jù)類(lèi)型,聲明變量都用var
(4) 網(wǎng)頁(yè)中的js代碼應(yīng)該放到<script></script>標(biāo)簽中,<script>標(biāo)簽可以放到<head>、<body>等任意位置,并且一個(gè)頁(yè)面可以有不止一對(duì)<script></script>標(biāo)簽。
(5) 每條語(yǔ)句后用“;”來(lái)結(jié)尾,可以方便做js壓縮并且提高代碼可讀性
(6) 變量命名規(guī)則:以字母、下劃線或$開(kāi)頭,中間可以包括字母、數(shù)字、下劃線或$
(7) 關(guān)鍵字、保留字
關(guān)鍵字:break、else、new、var、case、finally、return、void、catch、for、switch、while、continue、function、this、with、default、if、throw、delete、in、try、do、instanceof、typeof
保留字:abstract、enum、int short、boolean、export、interface、static、byte、extends、long、super、char、final、native、synchronized、class、float、package、throws、const、goto、private、transient、debugger、implements、protected、volatile、double、import、public
(8) 注釋
單行注釋?zhuān)?// ;塊級(jí)注釋?zhuān)?strong>/* */;推薦使用單行注釋
(9) 數(shù)據(jù)類(lèi)型
js中有5種簡(jiǎn)單數(shù)據(jù)類(lèi)型(也稱為基本數(shù)據(jù)類(lèi)型):Undefined(未定義) 取值-undefined、Null(空對(duì)象) 取值-null、Boolean(布爾) 取值-true或false、Number(數(shù)字) 取值-所有數(shù)字,包含整數(shù)和小數(shù),范圍相當(dāng)于double、String(字符串) 取值-。還有1種復(fù)雜數(shù)據(jù)類(lèi)型——Object(對(duì)象類(lèi)型) 取值-任何對(duì)象,本質(zhì)上是由一組無(wú)序的名值對(duì)組成的。
typeof運(yùn)算符用來(lái)檢測(cè)變量的數(shù)據(jù)類(lèi)型
"undefined"——如果這個(gè)值未定義;
"boolean" ——如果這個(gè)值是布爾值;
"string" ——如果這個(gè)值是字符串;
"number" ——如果這個(gè)值是數(shù)值;
"object" ——如果這個(gè)值是對(duì)象或null;
"function" ——如果這個(gè)值是函數(shù);
(10) 其它語(yǔ)句如if、while、for等等與C#幾乎一致
(11) 轉(zhuǎn)義字符“\”也與C#一樣
(1) ==與===
==、!=:對(duì)于其兩邊的表達(dá)式,如果類(lèi)型相同,則直接比較,如果不同,則嘗試轉(zhuǎn)換成為相同類(lèi)型再判斷;==認(rèn)為null與undefined、undefined與undefined是相等的
===、!==:判斷前不進(jìn)行類(lèi)型轉(zhuǎn)換,===兩邊必須類(lèi)型相同、值也相同時(shí)才會(huì)返回true
(2) null與undefined
null:表示一個(gè)有意義的值,表示“無(wú)值”或“無(wú)對(duì)象”,變量的狀態(tài)為已知狀態(tài);通過(guò)設(shè)置對(duì)象為null,來(lái)釋放對(duì)對(duì)象的引用,以便瀏覽器回收內(nèi)存。
undefined:
① 聲明變量但未賦值時(shí),變量的值為undefined
② 方法沒(méi)有return語(yǔ)句返回值時(shí),返回undefined
③ 未聲明的變量,通過(guò)typeof()檢測(cè)變量時(shí),返回"undefined"字符串。
④ 訪問(wèn)不存在的屬性時(shí)返回undefined
注:把null轉(zhuǎn)換為數(shù)字,結(jié)果為0。而把undefined轉(zhuǎn)換為數(shù)字結(jié)果為NaN。
(3) 判斷變量是否可用
變量不可用:變量聲明未賦值、變量未聲明就使用、變量值為null
判斷:
if(typeof(v) !='undefined' && v != null)
推薦寫(xiě)法:if(v) --這里會(huì)把v先轉(zhuǎn)換為boolean類(lèi)型再判斷 ;對(duì)于null、undefined、0、空字符串就會(huì)轉(zhuǎn)換為false
(4) 變量作用域
① 全局變量:在頁(yè)面上直接聲明的變量,“全局”是指在整個(gè)當(dāng)前頁(yè)面都能訪問(wèn)到的變量;
默認(rèn)屬于windows成員
直到頁(yè)面關(guān)閉或?yàn)g覽器關(guān)閉才釋放資源
在每個(gè)<script></script>中都可以訪問(wèn)到
容易引起“命名沖突”
② 函數(shù)內(nèi)部變量:作用范圍為當(dāng)前函數(shù)內(nèi)部
③ 沒(méi)有塊級(jí)作用域范圍,所以在方法中任何地方聲明的變量都是在整個(gè)方法中有效。
④ 聲明變量可以用“var”,也可不用,不用“var”聲明的變量是全局變量;
⑤ js中同樣不能有重名的變量,js發(fā)現(xiàn)變量重復(fù)后悔自動(dòng)忽略后面的聲明,只是用第一次聲明的變量
注:推薦在js聲明變量時(shí)要用var,且少使用全局變量
(5) 數(shù)據(jù)類(lèi)型轉(zhuǎn)換
① 字符串轉(zhuǎn)化數(shù)字
字符串轉(zhuǎn)換為整數(shù):parseInt(numString, [radix]) radix 為要解析的字符串的基數(shù)。該值介于 2 ~ 36 之間。如果省略該參數(shù)或其值為 0,則數(shù)字將以 10 為基礎(chǔ)來(lái)解析。如果它以 “0x” 或 “0X” 開(kāi)頭,將以 16 為基數(shù)。如果該參數(shù)小于 2 或者大于 36,則 parseInt() 將返回 NaN。
字符串轉(zhuǎn)化為小數(shù):parseFloat(numString)
② 任意類(lèi)型到指定類(lèi)型
轉(zhuǎn)為字符串:String(object)、對(duì)象.toString()
轉(zhuǎn)為Boolean:Boolean(object)
轉(zhuǎn)化為數(shù)字:Number(object)
③ NaN:當(dāng)某類(lèi)型轉(zhuǎn)化為數(shù)字失敗時(shí),返回NaN,表示不是一個(gè)數(shù)字;NaN不等于任何值,包括它自己,判斷時(shí)需要使用isNaN(arg)函數(shù)
(6) eval() 函數(shù)
eval() 函數(shù)可將字符串轉(zhuǎn)換為代碼執(zhí)行,并返回一個(gè)或多個(gè)值.
如果eval函數(shù)在執(zhí)行時(shí)遇到錯(cuò)誤,則拋出異常給調(diào)用者.
類(lèi)似的函數(shù)是loadcode ,loadcode并不立即執(zhí)行代碼,而是返回一個(gè)函數(shù)對(duì)象.
并且loadcode支持路徑參數(shù),eval并不支持. eval并不支持代碼中的return語(yǔ)句,而是將代碼作為表達(dá)式直接計(jì)算出結(jié)果.
注:不推薦使用,效率低且不安全
(7) String對(duì)象
① length屬性:獲取字符串的字符個(gè)數(shù)。(無(wú)論中文字符還是英文字符都算1個(gè)字符。)
② charAt(index)方法:獲取指定索引位置的字符。(索引從0開(kāi)始)
③ indexOf(‘字符串’,startIndex)方法:獲取指定字符串第一次出現(xiàn)的位置。startIndex表示從第幾個(gè)開(kāi)始搜索。
④ split(‘分隔符’,limit);//根據(jù)分隔符將一個(gè)字符串返回為一個(gè)數(shù)組。limit表示要返回的數(shù)組的最大長(zhǎng)度(可自定義)。多個(gè)
隔符使用正則表達(dá)式:var msg = 'a★b★c☆d☆e#f';var vals = msg.split(/☆|★|#/);alert(vals);
⑤ substr(startIndex,len)//從startIndex開(kāi)始,截取len個(gè)字符。
⑥ substring(startIndex,stopIndex)//從startIndex開(kāi)始,截取到stopIndex位置(不包括stopIndex所在的字符)。
⑦ toUpperCase()//轉(zhuǎn)換大寫(xiě)、toLowerCase();//轉(zhuǎn)換小寫(xiě)
⑧ match()、replace()、search()方法,正則表達(dá)式相關(guān)
(8) 普通函數(shù)
-->基礎(chǔ)
① 使用function關(guān)鍵字
② 無(wú)返回值類(lèi)型
③ 無(wú)參數(shù)的類(lèi)型
④ JavaScript中函數(shù)永遠(yuǎn)有返回值,如果沒(méi)有執(zhí)行return語(yǔ)句,則返回undefined。(把函數(shù)當(dāng)做“構(gòu)造函數(shù)”時(shí),return語(yǔ)句將不返回)
⑤ 易錯(cuò):自定義函數(shù)名不要與不要和js內(nèi)置、dom內(nèi)置等系統(tǒng)函數(shù)名重名。如selectAll、focus等函數(shù)名不要用
⑥ 函數(shù)名稱采用“駝峰命名法”,而非C#中的帕斯卡命名法
-->函數(shù)重載
① js中沒(méi)有重載的概念,當(dāng)遇到多個(gè)重名的方法后,最后一個(gè)方法定義會(huì)覆蓋前面的所有方法定義
② 利用arguments實(shí)現(xiàn)js函數(shù)重載:通過(guò)arguments對(duì)象可以判斷用戶在調(diào)用函數(shù)時(shí),是否傳遞了參數(shù),以及傳遞了幾個(gè)參數(shù),相當(dāng)于C#中的params,它是用起來(lái)像數(shù)組的一個(gè)對(duì)象,但arguments對(duì)象本身并不是數(shù)組對(duì)象。
③ 例子
function add(){ var sum = 0; for(var i =0; i < arguments.length; i++){ sum += arguments[i]; }}
注:推薦使用“命名參數(shù)”增加程序可讀性
-->“函數(shù)”即“對(duì)象”
① 對(duì)象成員
length屬性,獲取方法命名參數(shù)的個(gè)數(shù)
prototype屬性、arguments屬性(函數(shù)執(zhí)行時(shí)才可獲?。?/p>
toString()方法,獲取方法的源代碼
② 例子
<script type="text/javascript"> function getUserName() { var first_name = ‘Li'; var last_name = ‘Li'; return last_name + first_name; } //此時(shí)user_name中為函數(shù)getUserName()執(zhí)行完畢后的返回值 //var user_name = getUserName(); //此時(shí)user_name就相當(dāng)于是函數(shù)getUserName var user_name = getUserName; alert(user_name); //相當(dāng)于user_name.toString()獲取函數(shù)的源代碼 alert(user_name.length); //獲取函數(shù)的參數(shù)的個(gè)數(shù) var result = user_name(); //調(diào)用該函數(shù) alert(result); </script>
(9) 調(diào)試與排錯(cuò):可以利用vs和chrome、firefox瀏覽器中設(shè)置斷點(diǎn)進(jìn)行調(diào)試
(1) 函數(shù)聲明與變量聲明預(yù)解析
① 函數(shù)預(yù)解析:在頁(yè)面中的所有函數(shù)定義語(yǔ)句,都會(huì)在代碼執(zhí)行前進(jìn)行“預(yù)解析”,在“預(yù)解析”的時(shí)候,對(duì)于重名的函數(shù)就會(huì)用最后一次定義覆蓋所有前面的定義。
② 變量聲明預(yù)解析:對(duì)于在函數(shù)內(nèi)部定義的局部變量,無(wú)論是定義在函數(shù)的任何位置,在函數(shù)執(zhí)行前也會(huì)進(jìn)行“預(yù)解析”,會(huì)把變量聲明語(yǔ)句“置頂”解析。也就是說(shuō)無(wú)論變量聲明語(yǔ)句在函數(shù)的任何地方,都會(huì)被認(rèn)為是寫(xiě)在了函數(shù)一開(kāi)始的部分,所以后面的語(yǔ)句都可以直接使用這些變量了。但注意:這里只會(huì)把變量聲明的語(yǔ)句“預(yù)解析”,賦值語(yǔ)句并不會(huì)一同被“解析”。
(2) 匿名函數(shù)
將函數(shù)定義語(yǔ)句當(dāng)做一個(gè)表達(dá)式來(lái)處理,它可以減少函數(shù)命名問(wèn)題,并且減少文件的字節(jié)數(shù)。
① 寫(xiě)法一:
var fn = function (x, y) { return x + y; };(勿忘分號(hào)) 調(diào)用:alert(fn(10,20)); 應(yīng)用之一:設(shè)置事件處理程序。
② 寫(xiě)法二:
var result = (function (x, y) { return x + y; })(10, 20); 調(diào)用:alert(result);
③ 寫(xiě)法三:
var fn = new Function("x,y,z", "var sum=x+y+z;alert(sum);"); 調(diào)用:fn(10, 20, 30);
(3) 數(shù)組
① 介紹:js中通過(guò)Array對(duì)象創(chuàng)建數(shù)組,它是集成數(shù)組、ArrayList集合、Hashtable集合、棧集合、隊(duì)列集合等的一個(gè)“超強(qiáng)綜合體”
② 使用:var ages = new Array();ages[0]=10;ages[1]=16;
通過(guò)for循環(huán)來(lái)遍歷:for(var i=0;i<ages.length;i++)
注:用length來(lái)獲取數(shù)組元素中的個(gè)數(shù)
③ 其它聲明方式
new Array(size)//聲明數(shù)組初始長(zhǎng)度為size
new Array(a,b,c…)//聲明數(shù)組并設(shè)置初始值
推薦使用數(shù)組字面量:var arr =[12,‘ok’,true]
④ 沒(méi)有多維數(shù)組,只能嵌套數(shù)組 :var arr = [12, ‘ok’,[‘a(chǎn)bc’,false]]
⑤ Array的方法:toString,join,reverse、concat、sort、push、pop、shift、unshift、slice、splice等等
⑥ Array鍵值對(duì)集合:鍵值對(duì)聲明 var arr={'dawei':'大衛(wèi)','jim':'吉姆'};
Array數(shù)組本身就是一個(gè)鍵值對(duì)集合,“普通數(shù)組”,即通過(guò)下標(biāo)來(lái)獲取元素,只不過(guò)是一個(gè)“特殊的鍵值對(duì)集合”而已,把下標(biāo)作為“鍵”,把數(shù)組元素最為值。
當(dāng)鍵是整數(shù)時(shí)認(rèn)為是“普通數(shù)組”,length屬性具有長(zhǎng)度。
當(dāng)鍵是非整數(shù)字符串時(shí)認(rèn)為是“鍵值對(duì)集合”。
不建議將“普通數(shù)組”與“鍵值對(duì)集合”混用。
遍歷:
for (var key in arrayDict) { console.log(key + '......' + arrayDict[key]);}
(4) 面向?qū)ο?/p>
① 介紹
JavaScript中沒(méi)有“類(lèi)”的概念,全都是對(duì)象?!昂瘮?shù)”是對(duì)象,通過(guò)new 關(guān)鍵字調(diào)用“函數(shù)”創(chuàng)建的也是對(duì)象。
函數(shù)本身是一個(gè)“函數(shù)對(duì)象”,而通過(guò)new關(guān)鍵字調(diào)用“函數(shù)”創(chuàng)建的對(duì)象又是另外一個(gè)對(duì)象,是兩個(gè)不同的對(duì)象。
js中的面向?qū)ο笠捕际峭ㄟ^(guò)維護(hù)變量的作用域等方式來(lái)模擬的
② 構(gòu)造函數(shù)
構(gòu)造函數(shù)也是函數(shù),只是調(diào)用時(shí)使用new關(guān)鍵字;
構(gòu)造函數(shù)使用“帕斯卡”命名;
創(chuàng)建帶參數(shù)的構(gòu)造函數(shù):通過(guò)this關(guān)鍵字初始化成員;
linstanceof關(guān)鍵字,判斷對(duì)象是否屬于某個(gè)“類(lèi)型”(構(gòu)造函數(shù)); ex:p1 instanceof Person
③ js模擬“類(lèi)”
-->prototype屬性
prototype是“函數(shù)對(duì)象”的屬性,可實(shí)現(xiàn)類(lèi)似C#中擴(kuò)展方法的功能;
注:不要為“內(nèi)置對(duì)象”隨便添加新成員。防止混亂,可以對(duì)自定義對(duì)象通過(guò)該方式來(lái)添加新成員。
prototype原理圖:
-->繼承
js中的“繼承”一般通過(guò)prototype來(lái)實(shí)現(xiàn)的,也可以通過(guò)apply和call來(lái)進(jìn)行模擬實(shí)現(xiàn)
任何類(lèi)型都直接或間接繼承自O(shè)bject
function Person(){ } Person.prototype.hello = "hello"; Person.prototype.sayHello = function(){ alert(this.hello); } function Child(){ } Child.prototype = new Person();//這行的作用是:將Parent中將所有通過(guò)prototype追加的屬性和方法都追加到Child,從而實(shí)現(xiàn)了繼承 Child.prototype.world = "world"; Child.prototype.sayWorld = function(){ alert(this.world); } var c = new Child(); c.sayHello(); c.sayWorld();
擴(kuò)展:《js中call與apply用法》、《js繼承的實(shí)現(xiàn)》
(5) 函數(shù)閉包(變量作用域問(wèn)題)
在一個(gè)函數(shù)內(nèi)部又定義了一個(gè)函數(shù),內(nèi)部函數(shù)函數(shù)能訪問(wèn)外部函數(shù)作用域范圍內(nèi)的變量,這時(shí)這個(gè)內(nèi)部函數(shù)就叫做閉包。無(wú)論這個(gè)內(nèi)部函數(shù)在哪里被調(diào)用都能訪問(wèn)的到外部函數(shù)作用域中的那些變量
作用:匿名自執(zhí)行函數(shù)、實(shí)現(xiàn)緩存、實(shí)現(xiàn)封裝、實(shí)現(xiàn)面向?qū)ο笾械膶?duì)象
擴(kuò)展:《js閉包的作用》
聯(lián)系客服