js基礎(chǔ)陣營:變量篇之變量類型

前面我們已經(jīng)說過了變量的提升,那么變量具體有哪些類型呢?
當(dāng)前JavaScript具有5個基本數(shù)據(jù)類型,分別是:null,undefined,string,number,boolean。以及兩個非基礎(chǔ)數(shù)據(jù)類型,分別是:object,symbol(ES6新增)。下面我們來一一來介紹下
null
顧名思義是空,沒有的意思,所以在js中他是一個空指針,空值的意思。他不同于沒有定義(ReferenceError)以及定義未賦值(undefined)。通常我們用來定義一個對象為空的賦值。那么如果我們通過typeof來查看null的類型會是什么值呢?

image.png

我們可以看到是一個object,而不是我們想象中的null。為什么呢?在我看來就是一個當(dāng)年設(shè)計語言的時候為了靠近其他語言,所以通過null來表明是一個空指針。那么我們?nèi)绻袛嘁粋€數(shù)據(jù)是否是null還是對象呢?我們可以通過以下代碼來實現(xiàn)

if(typeof data === 'object' && !data){
  // 這里就是null了
}

undefined
JavaScript中第二個特殊的變量就是undefined。通過我們定義了一個變量,但是沒有初始化的時候,此時這個變量的值即為undefined。我們可以在控制臺看下以下代碼

var name;
typeof name; //undefined

那么如果我們一個變量沒有定義,通過typeof來看是什么呢?

image.png

從程序的邏輯上來講是合理的,但是從我們?nèi)粘i_發(fā)來講這樣就很難通過typeof 來判斷是未定義還是未初始化。所以我們在日常開發(fā)中需要養(yǎng)成將變量定義的時候初始化的習(xí)慣,這樣我們才能通過typeof來判斷數(shù)據(jù)的正確性。
boolean
布爾類型,只有兩個值,不同于上面兩個只有一個值,他永遠只有true以及false兩種情況。通常我們在需要判斷的時候都需要使用布爾值。雖然布爾值只有true和false兩個值,但是在javascript中所有的值都有跟這兩個值相對等的值。我們可以通過顯式的方法Boolean來獲取。那么哪些值會對應(yīng)的是true呢?將在下一章變量的轉(zhuǎn)換中有講解(又挖了一個坑)。
string
字符串,在js中通過通過“”或者‘’來創(chuàng)建,例如

var name = '二鍋頭';
var name2 = "二鍋頭";

在js中字符串是不可變的。也就是說在js中如果創(chuàng)建了一個變量且初始化了后,值是不能改變,如果改變則是先銷毀原有的值,然后創(chuàng)建新值后賦值給原有變量。其實不難理解,在前面我們已經(jīng)說過了,字符串是非引用類型,也就是說我們存儲的值是直接存儲在內(nèi)存中的,當(dāng)我們要去改變的時候必然要先去清除原有的值,才能賦值。所以我們在執(zhí)行以下代碼的時候是什么樣的呢?

var name="二鍋頭";
name += ',你好';

按照我們先銷毀再賦值的理論,我們可以明顯知道,在執(zhí)行這代碼的時候,編輯器先創(chuàng)建一個6位的字符串,存儲二鍋頭,你好然后將原有的name值的二鍋頭銷毀后再將6位的字符串賦值給name.在低版本的瀏覽器中我們其實能感受這個過程,因為在某些低版本瀏覽器中會很慢。
number
數(shù)字,包括整數(shù)以及浮點數(shù)兩類。整個number類型本身是沒有什么可講解的,其更多的是在數(shù)值轉(zhuǎn)換上,我們將在下章講解。但是關(guān)于浮點數(shù)有一個很常見的問題,那就是浮點數(shù)的精度問題,我們來看一下代碼

0.1 + 0.2 === 0.3

在我們的認(rèn)知中應(yīng)該是true,但是實際上不是,實際上返回的值是false。為什么呢?歸根到底就是因為精度問題,由于js的浮點數(shù)的精度是17位,所以其精度根本無法與整數(shù)相比。所以才會導(dǎo)致此類問題的出現(xiàn)。這個時候我們不僅僅要擔(dān)心,是不是浮點數(shù)都這樣,大可不必,大多數(shù)的情況下數(shù)據(jù)是不會出現(xiàn)問題的,那么我們?nèi)绾文軐⑸厦娴拇a變成true呢?此時我們需要使用ES6中的EPSILON(機器精度)。因此我們可以使用以下方法來處理上面的問題

function test(n1,n2) {
   return Math.abs(n1- n2) <  Number.EPSILON
}
test(0.3,(0.1 + 0.2));

object
對象,其實就是數(shù)據(jù)和功能的有序集合。對象的創(chuàng)建不同于前面的幾個類型的數(shù)據(jù),通常對象的創(chuàng)建需要借助于對象類型來創(chuàng)建。例如:

var person = new Object();

但是在實際的日常工作中,我們很少這樣定義,通常通過一個{}來定義,例如:

var person = {};

兩者都能創(chuàng)建出一個對象。
至此我們關(guān)于js中的變量類型都已經(jīng)說明完成了,其實還有一個symbol對象沒有說明,此類型我們將在后面ES6篇章中詳細說明。下一章我們將開啟類型轉(zhuǎn)換。敬請期待

最后編輯于
?著作權(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)容