ECMAScript?的?6?種簡單數(shù)據(jù)類型
前言
本文為JSRedBook數(shù)據(jù)類型, 主要講述 ECMAScript 的 6 種簡單數(shù)據(jù)類型(原始類型)中的其中三種:Undefined
、Null
、Boolean
以及常用的操作符。
ECMAScript 的數(shù)據(jù)類型很靈活,一種數(shù)據(jù)類型可以當(dāng)作多種數(shù)據(jù)類型來使用
typeof 操作符
typeof操作符用于確定(檢測)任意變量的數(shù)據(jù)類型
類型檢測
對一個(gè)值使用 typeof
操作符會返回下列字符串之一:
數(shù)據(jù)類型 | 檢測結(jié)果 |
---|---|
undefined | 表示值為 未定義 |
boolean | 表示值為 布爾值 |
string | 表示值為 字符串 |
number | 表示值為 數(shù)值 |
symbol | 表示值為 符號 |
function | 表示值為 函數(shù) |
object | 表示值為 對象 或 null |
使用說明
下面是使用 typeof
操作符的例子:
?const message = "Hello" ?console.log(typeof(msssage)) // "string" ?console.log(typeof 99 ) // "number"
注意:因?yàn)?nbsp;typeof
是一個(gè)操作符而不是函數(shù),所以不需要參數(shù)(但可以使用參數(shù))
小知識
調(diào)用typeof null
返回的是 "object"。這是因?yàn)樘厥庵?nbsp;null
被認(rèn)為是一個(gè)對空對象的引用
注意: 嚴(yán)格來講,函數(shù)在 ECMAScript 中被認(rèn)為是對象,并不代表一種數(shù)據(jù)類型;但函數(shù)也有自己特殊的屬性,所以就有必要通過
typeof
操作符來區(qū)分函數(shù)和其他對象。
Undefined 類型
Undefined 類型只有一個(gè)值,就是特殊值 undefined
增加這個(gè)特殊值的目的就是為了正式明確空對象指針(null
)和未初始化變量的區(qū)別
練習(xí)場景
當(dāng)使用 var 或 let 聲明了變量但沒有初始化時(shí),就相當(dāng)于給變量賦予了 undefined 值,如下:
?let message; ?console.log(message == undefined); // true
變量 message 在聲明的時(shí)候并未初始化,因此比較它和 undefined 的字面值時(shí),兩者是相等的
我們再來看看下面這個(gè)例子:
?let message = undefined; ?console.log(message == undefined); // true
這是個(gè)不必要的預(yù)定義,因?yàn)槟J(rèn)情況下任何未經(jīng)初始化的變量都會取得 undefined
值。
注意: 一般來說,永遠(yuǎn)不用顯式地給某個(gè)變量設(shè)置
undefined
值,字面值undefined
主要用于比較,而且在 ECMA-262 第 3 版之前是不存在的。
undefined 與 not defined 的區(qū)別
包含 undefined
值的變量跟未定義變量是有區(qū)別的,如下:
?let message; ? // 這個(gè)變量被聲明了,只是值為 undefined ?// let age; 確保沒有聲明過這個(gè)變量 ?? ?console.log(message); // "undefined" ?console.log(age); // 報(bào)錯(cuò);
在上面的例子中,第一個(gè) console.log
因?yàn)樽兞縨essage未定義值,即為"undefined";而第二個(gè)console.log
要輸出一個(gè)未聲明的變量 age 的值,因此會導(dǎo)致報(bào)錯(cuò)。
注意: 對未聲明的變量,只能執(zhí)行一個(gè)有用的操作就是對它調(diào)用
typeof
。(對未聲明的變量調(diào)用delete
也不會報(bào)錯(cuò),但這個(gè)操作沒什么用,實(shí)際上在嚴(yán)格模式下會拋出錯(cuò)誤)
使用 typeof 檢測 undefined
在對未初始化的變量調(diào)用 typeof
時(shí),返回的結(jié)果是"undefined",但對未聲明的變量調(diào)用它時(shí),返回的結(jié)果還是"undefined",這就有點(diǎn)讓人看不懂了。比如下面的例子:
?let message; //這個(gè)變量被聲明了,只是值為 undefined ?// 確保沒有聲明過這個(gè)變量 ?? ?// let age ?console.log(typeof message); // "undefined" ?console.log(typeof age); // "undefined"
這就奇怪了(⊙?⊙),為什么無論是聲明還是未聲明,typeof
返回的都是字符串"undefined"?。
因?yàn)閲?yán)格來講這兩個(gè)變量存在根本性差異,但它們都無法執(zhí)行實(shí)際操作,所以都返回 undefined
。
注意: 即使未初始化的變量會被自動(dòng)賦予
undefined
值,但仍然建議在聲明變量的同時(shí)進(jìn)行初始化。這樣當(dāng)typeof
返回 "undefined"時(shí),你就會知道那是因?yàn)榻o定的變量尚未聲明,而不是聲明了但未初始化。
小知識
undefined是一個(gè)假值。
但是也有很多其他的值可能也是假值,所以一定要明確自己想檢測的就是 undefined 這個(gè)字面值,而不僅僅是假值,如下:
?let message; // 這個(gè)變量被聲明了,只是值為 undefined ?? ?if (message) { ? // 這個(gè)塊不會執(zhí)行 ?} ?? ?if (!message) { ? // 這個(gè)塊會執(zhí)行 ?} ?? ?if (age) { // age 沒有聲明 ? // 這里會報(bào)錯(cuò) ?}
Null 類型
null
值表示一個(gè)空對象指針
練習(xí)場景
因?yàn)樗闹当硎究諏ο笾羔槪杂?code>typeof 傳一個(gè) null
會返回 “object”,如下:
?const test = null; ?console.log(typeof test); // "object" ?
建議: 在定義將來要保存對象值的變量時(shí),建議使用
null
來初始化,不要使用其他值;
這樣只要檢查這個(gè)變量的值是不是 null
就可以知道這個(gè)變量是否在后來被重新賦予了一個(gè)對象的引用,如下:
?if (car != null) { ? // car 是一個(gè)對象的引用 ?}
注意: 用等于操作符(==)比較 null 和 undefined 始終返回 true
因?yàn)?nbsp;undefined
值是由 null 值派生而來的,因此 ECMA-262
將它們定義為表面上相等,如下:
?console.log(null == undefined); // true
小知識
即使 null
和 undefined
有關(guān)系,它們的用途也是完全不一樣的。
如前所述,永遠(yuǎn)不必顯式地將變量值設(shè)置為 undefined
,但 null
不是這樣的;任何時(shí)候,只要變量要保存對象,而當(dāng)時(shí)又沒有那個(gè)對象可保存,就要用 null
來填充該變量;這樣就可以保持 null
是空對象指針的語義,并進(jìn)一步將其與 undefined 區(qū)分開來。
還有一點(diǎn):null
也是個(gè)假值,檢測方法與上述 undefined
一致
Boolean 類型
Boolean
(布爾值)類型是 ECMAScript
中使用最頻繁的類型之一,有兩個(gè)字面值:true
和 false
。
- 這兩個(gè)布爾值不同于數(shù)值,因此 true 不等于 1,false 不等于 0。
練習(xí)場景
布爾值字面量 true 和 false 是區(qū)分大小寫的
因此 True 和 False(及其他大小混寫形式)是有效的標(biāo)識符,但不是布爾值,如下:
?const a = true; // ? ?const b = false; // ? ?const c = True; // 報(bào)錯(cuò):True is not defined
類型轉(zhuǎn)換
雖然布爾值只有兩個(gè),但所有其他 ECMAScript
類型的值都有相應(yīng)布爾值的等價(jià)形式。
要將一個(gè)其他類型的值轉(zhuǎn)換為布爾值,可以調(diào)用特定的 Boolean()轉(zhuǎn)型函數(shù)
,如下:
?const message = "Hello juejin"; ?const remessage = Boolean(message); // true
在上述例子中,字符串 message
會被轉(zhuǎn)換為布爾值并保存在變量 remessage
中。
轉(zhuǎn)換表
Boolean()轉(zhuǎn)型函數(shù)
可以在任意類型的數(shù)據(jù)上調(diào)用,而且始終返回一個(gè)布爾值;什么值能轉(zhuǎn)換為 true
或 false
的規(guī)則取決于數(shù)據(jù)類型和實(shí)際的值。
下表總結(jié)了不同類型與布爾值之間的轉(zhuǎn)換規(guī)則:
數(shù)據(jù)類型 | 轉(zhuǎn)換為 true 的值 | 轉(zhuǎn)換為 false 的值 |
---|---|---|
Boolean | true | false |
String | 非空字符串 | ""(空字符串) |
Number | 非零數(shù)值(包括無窮值) | 0,NaN |
Object | 任意對象 | null |
Undefined | N/A(不存在) | undefined |
這個(gè)表非常重要,基本布爾轉(zhuǎn)換都得依靠這個(gè)表
if 中的轉(zhuǎn)換
像 if
等流控制語句會自動(dòng)執(zhí)行其他類型值到布爾值的轉(zhuǎn)換,如下:
?const test = "Hey"; ?if (test) { ? ? ?console.log("Value is True"); ?} ?// "Value is True"
上面的例子中,字符串 test
會被自動(dòng)轉(zhuǎn)換為等價(jià)的布爾值 true
,因此成功輸出 "Value is True"
;
由于存在這種自動(dòng)轉(zhuǎn)換,理解控制流語句中使用的是什么變量就非常重要,錯(cuò)誤地使用對象而不是布爾值會明顯改變應(yīng)用程序的執(zhí)行流。
總結(jié)
typeof
操作符用于確定任意變量的數(shù)據(jù)類型undefined
屬性表示變量沒有被賦值,或者根本沒有被聲明undefined
字面值主要用于比較null
值表示一個(gè)空對象指針null
用來填充一個(gè)要保存對象,而當(dāng)時(shí)又沒有那個(gè)對象可保存的變量Boolean
兩個(gè)字面值:true
和false
,泛指正確與錯(cuò)誤;Boolean()轉(zhuǎn)型函數(shù)
可以在任意類型的數(shù)據(jù)上調(diào)用,而且始終返回一個(gè)布爾值
到此這篇關(guān)于ECMAScript 的 6 種簡單數(shù)據(jù)類型的文章就介紹到這了,更多相關(guān)ECMAScript 數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
javascript實(shí)現(xiàn)3D切換焦點(diǎn)圖
一款用JavaScript模仿3D立體切換效果的js焦點(diǎn)幻燈片特效,使用方法很簡單:用鼠標(biāo)拖拽圖片向左右方向就好~2015-10-10javascript實(shí)現(xiàn)PC網(wǎng)頁里的拖拽效果
這篇文章主要介紹了javascript實(shí)現(xiàn)PC網(wǎng)頁里的拖拽效果的相關(guān)資料,需要的朋友可以參考下2016-03-03微信小程序wxml不能使用Array.includes條件判斷解決方法
這篇文章主要為大家介紹了微信小程序wxml不能使用Array.includes條件判斷解決方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11JS實(shí)現(xiàn)經(jīng)典的中國地區(qū)三級聯(lián)動(dòng)下拉菜單功能實(shí)例【測試可用】
這篇文章主要介紹了JS實(shí)現(xiàn)經(jīng)典的中國地區(qū)三級聯(lián)動(dòng)下拉菜單功能,結(jié)合完整實(shí)例形式分析了javascript基于事件響應(yīng)實(shí)現(xiàn)頁面元素動(dòng)態(tài)變換的相關(guān)操作技巧,需要的朋友可以參考下2017-06-06