鞏固JavaScript系列--01數(shù)據(jù)類型和函數(shù)

最近感覺校招也快到了,感覺自己的知識(shí)體系還是挺亂的,所以拿起了紅寶書再仔細(xì)讀讀,對(duì)知識(shí)點(diǎn)再鞏固鞏固,想每次學(xué)習(xí)完對(duì)整體的一個(gè)知識(shí)點(diǎn)總結(jié)總結(jié),寫下了自己的JavaScript系列學(xué)習(xí)。

script標(biāo)簽

在開始寫數(shù)據(jù)類型之前,想對(duì)<script>標(biāo)簽記下幾點(diǎn)內(nèi)容。

script標(biāo)簽有以下6個(gè)屬性

1.async:可選。表示應(yīng)該立即下載腳本,但不妨礙頁(yè)面中的其他操作,比如可以下載其他資源或等待加載其他腳本。只對(duì)外部腳本文件有效。

2.charset:可選。表示通過src屬性指定的代碼的字符集。由于大多數(shù)瀏覽器會(huì)忽略它的值,所有很少用

3.defer:可選。表示腳本可以延遲到文檔完全被解析和顯示之后再執(zhí)行。只對(duì)外部文件有效。

4.language:已放棄。

5.src:可選。表示包含要執(zhí)行的外部文件。

6.type:可選。表示編碼使用的腳本語(yǔ)言的內(nèi)容類型

這里重點(diǎn)記下兩個(gè)比較特殊的屬性async和defer

defer:設(shè)置defer的腳本會(huì)在整個(gè)頁(yè)面都解析完畢之后再執(zhí)行。

async:指定async屬性的目的是不讓頁(yè)面等待其腳本下載和執(zhí)行,從而異步加載頁(yè)面的其他內(nèi)容。

數(shù)據(jù)類型

ECMAScript中有5種簡(jiǎn)單的數(shù)據(jù)類型(也稱為基本數(shù)據(jù)類型):Undefined、Null、Boolean、Number和String。

還有一種復(fù)雜數(shù)據(jù)類型:Object。Object本質(zhì)是由一組無序的名值(鍵值)組成。

1. Undefined類型

Undefined類型的值就只有一個(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類型

Null類型的值也只有一個(gè),即null。從邏輯角度來看,null值表示一個(gè)空對(duì)象指針,這也是使用typeof操作符檢測(cè)null值時(shí)會(huì)返回object類型的原因。

var people=null
alert(typeof people)  //object

如果定義的變量準(zhǔn)備在將來用于保存對(duì)象,那么最好將該變量初始化為null而不是其他值(像默認(rèn)的undefined)

undefined值是派生自null值的,因此下面代碼返回的是true

alert(alert( null == undefined))  //true

但如果是全等操作的話,返回的是false

alert(alert( null === undefined))  //false

無論什么時(shí)候都沒有必要把一個(gè)變量的值顯式的設(shè)置為undefined,可是同樣的規(guī)則對(duì)應(yīng)null卻是不適用。換句話說,只要意在保存對(duì)象的變量還沒有真正的保存對(duì)象,就應(yīng)該為其設(shè)置null值。這樣做的目的不僅體現(xiàn)null做為空對(duì)象指針的慣例,而且也有助于進(jìn)一步區(qū)分null和undefined。這也是null和undefined的只要區(qū)別。

3. Boolean類型

Boolean類型有兩個(gè)值即true和false。Boolean類型的知識(shí)點(diǎn)主要是下面這個(gè):

可以對(duì)任何數(shù)據(jù)類型調(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類型

  1. 浮點(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,所以千萬不要使用以下代碼,你會(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')
}
  1. 數(shù)值范圍: isFinite()函數(shù)在參數(shù)位于最大值(Number.MAX_VALUE)和最小值(Number.MIN_VALUE)之間會(huì)返回true。

  2. 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
  1. 數(shù)值轉(zhuǎn)換
    可以轉(zhuǎn)換為數(shù)值的函數(shù)有Number()、parseInt()、parseFloat()。Number()函數(shù)可以用于任何數(shù)據(jù)類型,而parseInt()和parseFloat()專門用于把字符串轉(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ù),故沒有第二個(gè)參數(shù)。

5. String類型

轉(zhuǎn)換為字符的函數(shù)有:toString()和String()。

toString():①數(shù)值、布爾、對(duì)象、字符串都有toString()方法。但是null和undefined沒有toString()方法。②多數(shù)情況下,toString()方法不必傳參,但也可以為其傳一個(gè)參數(shù),該參數(shù)可以將num.toString(2|8|10|16)返回幾進(jìn)制的字符串表示

String():在不知道要轉(zhuǎn)換的值是不是undefined和null的情況下,還可以使用String()函數(shù)。這個(gè)函數(shù)能將任何類型的值轉(zhuǎn)換為字符串。

6. Object類型

ECMAScript中的對(duì)象其實(shí)就是一組數(shù)據(jù)和功能的集合。

Object的每個(gè)實(shí)例都有下列的屬性和方法:

  1. constructor:保存著用于創(chuàng)建當(dāng)前對(duì)象的函數(shù),即構(gòu)造器。
  2. hasOwnProperty:用于檢查給定的屬性在當(dāng)前對(duì)象實(shí)例中是否存在(而不是在實(shí)例的原型中)。如:people.hasOwnProperty('name')
  3. isPrototypeOf(object): 檢測(cè)傳入的對(duì)象是否是當(dāng)期對(duì)象的原型
  4. propertyIsEnumerable(propertyName): 檢測(cè)傳入的屬性能否使用for-in進(jìn)行枚舉
    5.toLocaleString():返回對(duì)象的字符串表示,該字符串與執(zhí)行環(huán)境對(duì)應(yīng)
  5. toString():返回對(duì)象的字符串表示
  6. valueOf:返回對(duì)象的字符串、數(shù)組或布爾的表示。通常與toString()的返回值相同

在ECMAScript中Object是所有對(duì)象的基礎(chǔ),因此所有對(duì)象都具有上面這些基本的屬性和方法。

函數(shù)

函數(shù)中個(gè)人感覺想要去注意的是函數(shù)的返回值和函數(shù)的參數(shù)。

  1. 函數(shù)的返回值:函數(shù)中要么讓函數(shù)始終都返回一個(gè)值,要么永遠(yuǎn)都不要返回值。如果未指定返回值的函數(shù),那么它返回的是一個(gè)特殊的undefined值
  2. 理解參數(shù):

ECMAScript函數(shù)傳遞參數(shù)比較靈活,定義函數(shù)參數(shù)也比較靈活。原因在于ECMAScript的參數(shù)在內(nèi)部是用一個(gè)數(shù)組來表示的。函數(shù)接收到的是這個(gè)數(shù)組,而不關(guān)心數(shù)組中包含哪些參數(shù)。實(shí)際上在函數(shù)體內(nèi)可以通過arguments對(duì)象來訪問這個(gè)參數(shù)數(shù)組,從而獲取傳遞給函數(shù)的每一個(gè)參數(shù)。

arguments對(duì)象只是與數(shù)組類似(他并不是Array的實(shí)例),因?yàn)榭梢允褂肹 ]來訪問它的每一個(gè)元素,使用length屬性可以確定傳遞進(jìn)來多少參。arguments的length由傳入的參數(shù)個(gè)數(shù)決定的,不是由定義函數(shù)時(shí)的命名參數(shù)的個(gè)數(shù)決定的。對(duì)于沒有傳遞值的命名參數(shù)將被自動(dòng)賦予undefined,這就跟定義了變量但沒有初始化一樣。

函數(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中是沒有真正的重載(方法名一樣,接收的參數(shù)的類型或數(shù)量不同),因?yàn)镋CMAScript不存在函數(shù)簽名(函數(shù)簽名由參數(shù)個(gè)數(shù)與其類型組成)的特性?。?!函數(shù)名相同的情況下ECMAScript中前面定義的函數(shù)會(huì)被后面定義的函數(shù)所覆蓋,故而沒有真正的重載,但可以使用上面的代碼實(shí)現(xiàn)偽重載。

結(jié)尾

時(shí)間過的很快,不知不覺快要八月中旬了,各個(gè)公司也開始陸續(xù)開放網(wǎng)申了,不由的會(huì)想太多東西,故而感覺最近的節(jié)奏感沒跟上,上周在學(xué)Vue感覺也是不是很好,沒有把真正的心思放在學(xué)Vue上面,搞七搞八的一周也過去了?,F(xiàn)在自己就想靜靜,外面的世界如何如何,你的能力有限,大可不必在乎,現(xiàn)在呢要做的只有好好的靜下心,堅(jiān)持吧,一切順其自然!再說寫這個(gè)JavaScript系列,我也不知道我會(huì)寫多少,當(dāng)我還是會(huì)盡自己最大的努力去總結(jié)。

于 廈門高崎新村 自己的小屋

本文首發(fā)于個(gè)人博客>> shineTomorrow--一個(gè)路上慢慢行走的前端人

參考文獻(xiàn):《JavaScript高級(jí)程序設(shè)計(jì)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近感覺校招也快到了,感覺自己的知識(shí)體系還是挺亂的,所以拿起了紅寶書再仔細(xì)讀讀,對(duì)知識(shí)點(diǎn)再鞏固鞏固,想每次學(xué)習(xí)完對(duì)...
    shineTomorrow閱讀 236評(píng)論 0 3
  • 第5章 引用類型(返回首頁(yè)) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,692評(píng)論 0 4
  • 什么是 JavaScript 語(yǔ)言? JavaScript 是一種輕量級(jí)的腳本語(yǔ)言。所謂“腳本語(yǔ)言”(script...
    oWSQo閱讀 1,923評(píng)論 0 1
  • 有人說,香鍋就是沒有湯的火鍋。聽上去似乎有道理,但好像又不是那么回事......各位吃貨覺得呢?歡迎留言討論~ 地...
    味庫(kù)美食視頻閱讀 1,293評(píng)論 6 16
  • 什么是RxJava## RxJava 就是異步 RxJava 的異步實(shí)現(xiàn),是通過一種擴(kuò)展的觀察者模式來實(shí)現(xiàn)的。 一...
    IAM四十二閱讀 2,031評(píng)論 2 9

友情鏈接更多精彩內(nèi)容