最近感覺(jué)校招也快到了鉴裹,感覺(jué)自己的知識(shí)體系還是挺亂的饱狂,所以拿起了紅寶書(shū)再仔細(xì)讀讀,對(duì)知識(shí)點(diǎn)再鞏固鞏固朝氓,想每次學(xué)習(xí)完對(duì)整體的一個(gè)知識(shí)點(diǎn)總結(jié)總結(jié)铭污,寫(xiě)下了自己的JavaScript系列學(xué)習(xí)。
script標(biāo)簽
在開(kāi)始寫(xiě)數(shù)據(jù)類(lèi)型之前膀篮,想對(duì)<script>標(biāo)簽記下幾點(diǎn)內(nèi)容。
script標(biāo)簽有以下6個(gè)屬性
1.async:可選岂膳。表示應(yīng)該立即下載腳本誓竿,但不妨礙頁(yè)面中的其他操作,比如可以下載其他資源或等待加載其他腳本谈截。只對(duì)外部腳本文件有效筷屡。
2.charset:可選。表示通過(guò)src屬性指定的代碼的字符集簸喂。由于大多數(shù)瀏覽器會(huì)忽略它的值毙死,所有很少用
3.defer:可選。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行喻鳄。只對(duì)外部文件有效扼倘。
4.language:已放棄。
5.src:可選除呵。表示包含要執(zhí)行的外部文件再菊。
6.type:可選。表示編碼使用的腳本語(yǔ)言的內(nèi)容類(lèi)型
這里重點(diǎn)記下兩個(gè)比較特殊的屬性async和defer:
defer:設(shè)置defer的腳本會(huì)在整個(gè)頁(yè)面都解析完畢之后再執(zhí)行颜曾。
async:指定async屬性的目的是不讓頁(yè)面等待其腳本下載和執(zhí)行纠拔,從而異步加載頁(yè)面的其他內(nèi)容。
數(shù)據(jù)類(lèi)型
ECMAScript中有5種簡(jiǎn)單的數(shù)據(jù)類(lèi)型(也稱為基本數(shù)據(jù)類(lèi)型):Undefined泛豪、Null稠诲、Boolean侦鹏、Number和String。
還有一種復(fù)雜數(shù)據(jù)類(lèi)型:Object臀叙。Object本質(zhì)是由一組無(wú)序的名值(鍵值)組成略水。
1. Undefined類(lèi)型
Undefined類(lèi)型的值就只有一個(gè)undefined。
var name;
alert(name == undefined) //true
從上面可以看出匹耕,name只定義聚请,未初始化。它的默認(rèn)值為undefined稳其。與下面代碼一致驶赏。
var name=undefined;
alert(name == undefined) //true
其實(shí)我們?cè)贈(zèng)]必要為它賦值undefined,因?yàn)樗J(rèn)的值就是undefined既鞠。
2. Null類(lèi)型
Null類(lèi)型的值也只有一個(gè)煤傍,即null。從邏輯角度來(lái)看嘱蛋,null值表示一個(gè)空對(duì)象指針蚯姆,這也是使用typeof操作符檢測(cè)null值時(shí)會(huì)返回object類(lèi)型的原因。
var people=null
alert(typeof people) //object
如果定義的變量準(zhǔn)備在將來(lái)用于保存對(duì)象洒敏,那么最好將該變量初始化為null而不是其他值(像默認(rèn)的undefined)
undefined值是派生自null值的龄恋,因此下面代碼返回的是true
alert(alert( null == undefined)) //true
但如果是全等操作的話,返回的是false
alert(alert( null === undefined)) //false
無(wú)論什么時(shí)候都沒(méi)有必要把一個(gè)變量的值顯式的設(shè)置為undefined凶伙,可是同樣的規(guī)則對(duì)應(yīng)null卻是不適用郭毕。換句話說(shuō),只要意在保存對(duì)象的變量還沒(méi)有真正的保存對(duì)象函荣,就應(yīng)該為其設(shè)置null值显押。這樣做的目的不僅體現(xiàn)null做為空對(duì)象指針的慣例,而且也有助于進(jìn)一步區(qū)分null和undefined傻挂。這也是null和undefined的只要區(qū)別乘碑。
3. Boolean類(lèi)型
Boolean類(lèi)型有兩個(gè)值即true和false。Boolean類(lèi)型的知識(shí)點(diǎn)主要是下面這個(gè):
可以對(duì)任何數(shù)據(jù)類(lèi)型調(diào)用Boolean()函數(shù)金拒,而且總會(huì)返回一個(gè)Boolean值兽肤。
除了 0、-0、''、NaN腮鞍、null、undefined害驹、false對(duì)其使用Boolean函數(shù)返回的是假(false),其余返回的是真(true)
在流控制語(yǔ)句中(如if語(yǔ)句)蛤育,它會(huì)自動(dòng)執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換宛官。請(qǐng)看下面代碼:
var name='hmz';
if (name){
alert('my name is hmz') //my name is hmz
}
因?yàn)閚ame被自動(dòng)執(zhí)行相應(yīng)的Boolean轉(zhuǎn)換葫松,返回的是true
4. Number類(lèi)型
- 浮點(diǎn)數(shù)值: 浮點(diǎn)數(shù)值需要的內(nèi)存空間是保存整數(shù)值的兩倍,因此ECMAScript會(huì)不失時(shí)機(jī)地將浮點(diǎn)數(shù)值轉(zhuǎn)換為整數(shù)值底洗。浮點(diǎn)數(shù)值計(jì)算會(huì)產(chǎn)生舍入誤差腋么,比如0.1+0.2不會(huì)等于0.3,而是等于0.3000000...0004亥揖,所以千萬(wàn)不要使用以下代碼珊擂,你會(huì)發(fā)現(xiàn)代碼并不會(huì)去實(shí)現(xiàn)alert:
var a=0.1,b=0.2;
if(a+b == 0.3){ //不要做這樣的測(cè)試
alert('go this')
}
數(shù)值范圍: isFinite()函數(shù)在參數(shù)位于最大值(Number.MAX_VALUE)和最小值(Number.MIN_VALUE)之間會(huì)返回true。
NaN: NaN(Not a Number)是一個(gè)特殊的數(shù)值费变。NaN有兩個(gè)特點(diǎn)①任何涉及NaN的操作都會(huì)返回NaN摧扇;②NaN跟任何值都不相等,包括他自己本身挚歧。
根據(jù)NaN的兩個(gè)特點(diǎn)ECMAScript定義了isNaN()函數(shù)扛稽。isNaN()函數(shù)傳入的參數(shù)會(huì)被想轉(zhuǎn)換為數(shù)值再判斷,參數(shù)不會(huì)轉(zhuǎn)換為數(shù)值的函數(shù)會(huì)返回true滑负,否則函數(shù)會(huì)返回false在张。
alert(isNaN(NaN)) //true 不能被轉(zhuǎn)換為數(shù)值
alert(isNaN(10)) //false 10是數(shù)值
alert(isNaN('blue')) //true 不能被轉(zhuǎn)換為數(shù)值
alert(isNaN('10')) //false '10'會(huì)被轉(zhuǎn)換為10
alert(isNaN(true)) //false true會(huì)被轉(zhuǎn)換為1
- 數(shù)值轉(zhuǎn)換
可以轉(zhuǎn)換為數(shù)值的函數(shù)有Number()、parseInt()矮慕、parseFloat()帮匾。Number()函數(shù)可以用于任何數(shù)據(jù)類(lèi)型,而parseInt()和parseFloat()專(zhuān)門(mén)用于把字符串轉(zhuǎn)換為數(shù)值痴鳄。
parseInt()轉(zhuǎn)化為整數(shù)辟狈,可以傳入第二個(gè)參數(shù),告訴瀏覽器按幾進(jìn)制進(jìn)行解析數(shù)據(jù)夏跷,如果不傳第二個(gè)參數(shù),默認(rèn)是10進(jìn)制
parseFloat()轉(zhuǎn)化為浮點(diǎn)數(shù)明未,只解析整數(shù)槽华,故沒(méi)有第二個(gè)參數(shù)。
5. String類(lèi)型
轉(zhuǎn)換為字符的函數(shù)有:toString()和String()趟妥。
toString():①數(shù)值猫态、布爾、對(duì)象披摄、字符串都有toString()方法亲雪。但是null和undefined沒(méi)有toString()方法。②多數(shù)情況下疚膊,toString()方法不必傳參义辕,但也可以為其傳一個(gè)參數(shù),該參數(shù)可以將num.toString(2|8|10|16)返回幾進(jìn)制的字符串表示
String():在不知道要轉(zhuǎn)換的值是不是undefined和null的情況下寓盗,還可以使用String()函數(shù)灌砖。這個(gè)函數(shù)能將任何類(lèi)型的值轉(zhuǎn)換為字符串璧函。
6. Object類(lèi)型
ECMAScript中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。
Object的每個(gè)實(shí)例都有下列的屬性和方法:
- constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù)基显,即構(gòu)造器蘸吓。
- hasOwnProperty:用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中是否存在(而不是在實(shí)例的原型中)。如:people.hasOwnProperty('name')
- isPrototypeOf(object): 檢測(cè)傳入的對(duì)象是否是當(dāng)期對(duì)象的原型
- propertyIsEnumerable(propertyName): 檢測(cè)傳入的屬性能否使用for-in進(jìn)行枚舉
5.toLocaleString():返回對(duì)象的字符串表示撩幽,該字符串與執(zhí)行環(huán)境對(duì)應(yīng) - toString():返回對(duì)象的字符串表示
- valueOf:返回對(duì)象的字符串库继、數(shù)組或布爾的表示。通常與toString()的返回值相同
在ECMAScript中Object是所有對(duì)象的基礎(chǔ)窜醉,因此所有對(duì)象都具有上面這些基本的屬性和方法宪萄。
函數(shù)
函數(shù)中個(gè)人感覺(jué)想要去注意的是函數(shù)的返回值和函數(shù)的參數(shù)。
- 函數(shù)的返回值:函數(shù)中要么讓函數(shù)始終都返回一個(gè)值酱虎,要么永遠(yuǎn)都不要返回值雨膨。如果未指定返回值的函數(shù),那么它返回的是一個(gè)特殊的undefined值
- 理解參數(shù):
ECMAScript函數(shù)傳遞參數(shù)比較靈活读串,定義函數(shù)參數(shù)也比較靈活聊记。原因在于ECMAScript的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來(lái)表示的。函數(shù)接收到的是這個(gè)數(shù)組恢暖,而不關(guān)心數(shù)組中包含哪些參數(shù)排监。實(shí)際上在函數(shù)體內(nèi)可以通過(guò)arguments對(duì)象來(lái)訪問(wèn)這個(gè)參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)杰捂。
arguments對(duì)象只是與數(shù)組類(lèi)似(他并不是Array的實(shí)例)舆床,因?yàn)榭梢允褂肹 ]來(lái)訪問(wèn)它的每一個(gè)元素,使用length屬性可以確定傳遞進(jìn)來(lái)多少參嫁佳。arguments的length由傳入的參數(shù)個(gè)數(shù)決定的挨队,不是由定義函數(shù)時(shí)的命名參數(shù)的個(gè)數(shù)決定的。對(duì)于沒(méi)有傳遞值的命名參數(shù)將被自動(dòng)賦予undefined蒿往,這就跟定義了變量但沒(méi)有初始化一樣盛垦。
函數(shù)實(shí)現(xiàn)偽重載
function doAdd() {
if (arguments.length == 1){
alert(arguments[0])
}
else if (arguments.length == 2){
alert(arguments[0] + arguments[1])
}
}
doAdd(10) //10
doAdd(10,20) //30
上面利用arguments的length可以實(shí)現(xiàn)偽重載,但ECMAScript中是沒(méi)有真正的重載(方法名一樣瓤漏,接收的參數(shù)的類(lèi)型或數(shù)量不同)腾夯,因?yàn)镋CMAScript不存在函數(shù)簽名(函數(shù)簽名由參數(shù)個(gè)數(shù)與其類(lèi)型組成)的特性!J叱洹蝶俱!函數(shù)名相同的情況下ECMAScript中前面定義的函數(shù)會(huì)被后面定義的函數(shù)所覆蓋,故而沒(méi)有真正的重載饥漫,但可以使用上面的代碼實(shí)現(xiàn)偽重載榨呆。
結(jié)尾
時(shí)間過(guò)的很快,不知不覺(jué)快要八月中旬了庸队,各個(gè)公司也開(kāi)始陸續(xù)開(kāi)放網(wǎng)申了愕提,不由的會(huì)想太多東西馒稍,故而感覺(jué)最近的節(jié)奏感沒(méi)跟上,上周在學(xué)Vue感覺(jué)也是不是很好浅侨,沒(méi)有把真正的心思放在學(xué)Vue上面纽谒,搞七搞八的一周也過(guò)去了。現(xiàn)在自己就想靜靜如输,外面的世界如何如何鼓黔,你的能力有限,大可不必在乎不见,現(xiàn)在呢要做的只有好好的靜下心澳化,堅(jiān)持吧,一切順其自然稳吮!再說(shuō)寫(xiě)這個(gè)JavaScript系列缎谷,我也不知道我會(huì)寫(xiě)多少,當(dāng)我還是會(huì)盡自己最大的努力去總結(jié)灶似。
于 廈門(mén)高崎新村 自己的小屋
本文首發(fā)于個(gè)人博客>> shineTomorrow--一個(gè)路上慢慢行走的前端人
參考文獻(xiàn):《JavaScript高級(jí)程序設(shè)計(jì)》