鞏固JavaScript系列--01數據類型和函數

最近感覺校招也快到了,感覺自己的知識體系還是挺亂的,所以拿起了紅寶書再仔細讀讀,對知識點再鞏固鞏固,想每次學習完對整體的一個知識點總結總結,寫下了自己的JavaScript系列學習。

script標簽

在開始寫數據類型之前,想對<script>標簽記下幾點內容。

script標簽有以下6個屬性

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

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

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

4.language:已放棄。

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

6.type:可選。表示編碼使用的腳本語言的內容類型

這里重點記下兩個比較特殊的屬性async和defer

defer:設置defer的腳本會在整個頁面都解析完畢之后再執行。

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

數據類型

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

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

1. Undefined類型

Undefined類型的值就只有一個undefined。

var name;
alert(name == undefined)    //true

從上面可以看出,name只定義,未初始化。它的默認值為undefined。與下面代碼一致。

var name=undefined;
alert(name == undefined)    //true

其實我們再沒必要為它賦值undefined,因為它默認的值就是undefined。

2. Null類型

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

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

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

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

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

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

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

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

3. Boolean類型

Boolean類型有兩個值即true和false。Boolean類型的知識點主要是下面這個:

可以對任何數據類型調用Boolean()函數,而且總會返回一個Boolean值。

除了 0、-0、''、NaN、null、undefined、false對其使用Boolean函數返回的是假(false),其余返回的是真(true)

在流控制語句中(如if語句),它會自動執行相應的Boolean轉換。請看下面代碼:

var name='hmz';
if (name){
    alert('my name is hmz')  //my name is hmz
}

因為name被自動執行相應的Boolean轉換,返回的是true

4. Number類型

  1. 浮點數值: 浮點數值需要的內存空間是保存整數值的兩倍,因此ECMAScript會不失時機地將浮點數值轉換為整數值。浮點數值計算會產生舍入誤差,比如0.1+0.2不會等于0.3,而是等于0.3000000...0004,所以千萬不要使用以下代碼,你會發現代碼并不會去實現alert:
var a=0.1,b=0.2;
if(a+b == 0.3){       //不要做這樣的測試
    alert('go this')
}
  1. 數值范圍: isFinite()函數在參數位于最大值(Number.MAX_VALUE)和最小值(Number.MIN_VALUE)之間會返回true。

  2. NaN: NaN(Not a Number)是一個特殊的數值。NaN有兩個特點①任何涉及NaN的操作都會返回NaN;②NaN跟任何值都不相等,包括他自己本身。

根據NaN的兩個特點ECMAScript定義了isNaN()函數。isNaN()函數傳入的參數會被想轉換為數值再判斷,參數不會轉換為數值的函數會返回true,否則函數會返回false

alert(isNaN(NaN))  //true     不能被轉換為數值
alert(isNaN(10))   //false    10是數值
alert(isNaN('blue'))  //true  不能被轉換為數值
alert(isNaN('10')) //false   '10'會被轉換為10
alert(isNaN(true))  //false   true會被轉換為1
  1. 數值轉換
    可以轉換為數值的函數有Number()、parseInt()、parseFloat()。Number()函數可以用于任何數據類型,而parseInt()和parseFloat()專門用于把字符串轉換為數值。

parseInt()轉化為整數,可以傳入第二個參數,告訴瀏覽器按幾進制進行解析數據,如果不傳第二個參數,默認是10進制
parseFloat()轉化為浮點數,只解析整數,故沒有第二個參數。

5. String類型

轉換為字符的函數有:toString()和String()。

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

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

6. Object類型

ECMAScript中的對象其實就是一組數據和功能的集合。

Object的每個實例都有下列的屬性和方法:

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

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

函數

函數中個人感覺想要去注意的是函數的返回值和函數的參數。

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

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

arguments對象只是與數組類似(他并不是Array的實例),因為可以使用[ ]來訪問它的每一個元素,使用length屬性可以確定傳遞進來多少參。arguments的length由傳入的參數個數決定的,不是由定義函數時的命名參數的個數決定的。對于沒有傳遞值的命名參數將被自動賦予undefined,這就跟定義了變量但沒有初始化一樣。

函數實現偽重載

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

結尾

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

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

本文首發于個人博客>> shineTomorrow--一個路上慢慢行走的前端人

參考文獻:《JavaScript高級程序設計》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容