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

1.概述

JavaScript 的數(shù)據(jù)類型,共有六種。(ES6 又新增了第七種 Symbol 類型的值)

數(shù)值(number):整數(shù)和小數(shù)(比如1和3.14)

字符串(string):文本(比如Hello World)。

布爾值(boolean):表示真?zhèn)蔚膬蓚€特殊值,即true(真)和false(假)

undefined:表示“未定義”或不存在,即由于目前沒有定義,所以此處暫時沒有任何值

null:表示空值,即此處的值為空。

對象(object):各種值組成的集合

symbol(符號)

通常,數(shù)值、字符串、布爾值這三種類型,合稱為原始類型(primitive type)的值,即它們是最基本的數(shù)據(jù)類型,不能再細分了。對象則稱為合成類型(complex type)的值,因為一個對象往往是多個原始類型的值的合成,可以看作是一個存放各種值的容器。至于undefined和null,一般將它們看成兩個特殊值。
對象是最復(fù)雜的數(shù)據(jù)類型,又可以分成三個子類型。

狹義的對象(object)

數(shù)組(array)

函數(shù)(function)

狹義的對象和數(shù)組是兩種不同的數(shù)據(jù)組合方式,除非特別聲明,本教程的”對象“都特指狹義的對象。函數(shù)其實是處理數(shù)據(jù)的方法,JavaScript 把它當成一種數(shù)據(jù)類型,可以賦值給變量,這為編程帶來了很大的靈活性,也為 JavaScript 的“函數(shù)式編程”奠定了基礎(chǔ)。

2.typeof 運算符

JavaScript 有三種方法,可以確定一個值到底是什么類型。

typeof運算符

instanceof運算符

Object.prototype.toString方法

instanceof運算符和Object.prototype.toString方法,將在后文介紹。這里介紹typeof運算符。
typeof運算符可以返回一個值的數(shù)據(jù)類型。
數(shù)值、字符串、布爾值分別返回number、string、boolean。


1.png

函數(shù)返回function。


2.png

undefined返回undefined。
3.png

利用這一點,typeof可以用來檢查一個沒有聲明的變量,而不報錯。
4.png

上面代碼中,變量v沒有用var命令聲明,直接使用就會報錯。但是,放在typeof后面,就不報錯了,而是返回undefined。
實際編程中,這個特點通常用在判斷語句。


5.png

對象返回object。
6.png

null返回object。
7.png

null的類型是object,這是由于歷史原因造成的。1995年的 JavaScript 語言第一版,只設(shè)計了五種數(shù)據(jù)類型(對象、整數(shù)、浮點數(shù)、字符串和布爾值),沒考慮null,只把它當作object的一種特殊值。后來null獨立出來,作為一種單獨的數(shù)據(jù)類型,為了兼容以前的代碼,typeof null返回object就沒法改變了。
3.null和undefied

3.1概述

null與undefined都可以表示“沒有”,含義非常相似。將一個變量賦值為undefined或null,老實說,語法效果幾乎沒區(qū)別。


8.png

上面代碼中,變量a分別被賦值為undefined和null,這兩種寫法的效果幾乎等價。
在if語句中,它們都會被自動轉(zhuǎn)為false,相等運算符(==)甚至直接報告兩者相等


9.png

從上面代碼可見,兩者的行為是何等相似!谷歌公司開發(fā)的 JavaScript 語言的替代品 Dart 語言,就明確規(guī)定只有null,沒有undefined!
既然含義與用法都差不多,為什么要同時設(shè)置兩個這樣的值,這不是無端增加復(fù)雜度,令初學者困擾嗎?這與歷史原因有關(guān)。

1995年 JavaScript 誕生時,最初像 Java 一樣,只設(shè)置了null表示”無”。根據(jù) C 語言的傳統(tǒng),null可以自動轉(zhuǎn)為0。

10.png

從上面代碼可見,兩者的行為是何等相似!谷歌公司開發(fā)的 JavaScript 語言的替代品 Dart 語言,就明確規(guī)定只有null,沒有undefined!
既然含義與用法都差不多,為什么要同時設(shè)置兩個這樣的值,這不是無端增加復(fù)雜度,令初學者困擾嗎?這與歷史原因有關(guān)。
1995年 JavaScript 誕生時,最初像 Java 一樣,只設(shè)置了null表示”無”。根據(jù) C 語言的傳統(tǒng),null可以自動轉(zhuǎn)為0。


11.png

上面代碼中,null轉(zhuǎn)為數(shù)字時,自動變成0。
但是,JavaScript 的設(shè)計者 Brendan Eich,覺得這樣做還不夠。首先,第一版的 JavaScript 里面,null就像在 Java 里一樣,被當成一個對象,Brendan Eich 覺得表示“無”的值最好不是對象。其次,那時的 JavaScript 不包括錯誤處理機制,Brendan Eich 覺得,如果null自動轉(zhuǎn)為0,很不容易發(fā)現(xiàn)錯誤。
因此,他又設(shè)計了一個undefined。區(qū)別是這樣的:null是一個表示“空”的對象,轉(zhuǎn)為數(shù)值時為0;undefined是一個表示”此處無定義”的原始值,轉(zhuǎn)為數(shù)值時為NaN。


12.png

3.2 含義和用法

對于null和undefined,大致可以像下面這樣理解。
null表示空值,即該處的值現(xiàn)在為空。調(diào)用函數(shù)時,某個參數(shù)未設(shè)置任何值,這時就可以傳入null,表示該參數(shù)為空。比如,某個函數(shù)接受引擎拋出的錯誤作為參數(shù),如果運行過程中未出錯,那么這個參數(shù)就會傳入null,表示未發(fā)生錯誤。
undefined表示“未定義”,下面是返回undefined的典型場景。


13.png

4.布爾值

布爾值代表“真”和“假”兩個狀態(tài)。“真”用關(guān)鍵字true表示,“假”用關(guān)鍵字false表示。布爾值只有這兩個值。

下列運算符會返回布爾值:

兩元邏輯運算符: && (And),|| (Or)

前置邏輯運算符: ! (Not)

相等運算符:===,!==,==,!=

比較運算符:>,>=,<,<=

如果 JavaScript 預(yù)期某個位置應(yīng)該是布爾值,會將該位置上現(xiàn)有的值自動轉(zhuǎn)為布爾值。轉(zhuǎn)換規(guī)則是除了下面六個值被轉(zhuǎn)為false,其他值都視為#true。

undefined

null

false

0

NaN

""或''(空字符串)

布爾值往往用于程序流程的控制,請看一個例子。


14.png

上面代碼中,if命令后面的判斷條件,預(yù)期應(yīng)該是一個布爾值,所以 JavaScript 自動將空字符串,轉(zhuǎn)為布爾值false,導致程序不會進入代碼塊,所以沒有任何輸出。
注意,空數(shù)組([])和空對象({})對應(yīng)的布爾值,都是true。


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

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

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