前面我們已經說過了變量的提升,那么變量具體有哪些類型呢誊抛?
當前JavaScript具有5個基本數(shù)據(jù)類型,分別是:null,undefined,string,number,boolean贬堵。以及兩個非基礎數(shù)據(jù)類型,分別是:object结洼,symbol(ES6新增)黎做。下面我們來一一來介紹下
null
顧名思義是空,沒有的意思松忍,所以在js中他是一個空指針蒸殿,空值的意思。他不同于沒有定義(ReferenceError)以及定義未賦值(undefined)。通常我們用來定義一個對象為空的賦值宏所。那么如果我們通過typeof來查看null的類型會是什么值呢酥艳?
我們可以看到是一個object,而不是我們想象中的null楣铁。為什么呢?在我看來就是一個當年設計語言的時候為了靠近其他語言更扁,所以通過null來表明是一個空指針盖腕。那么我們如果判斷一個數(shù)據(jù)是否是null還是對象呢?我們可以通過以下代碼來實現(xiàn)
if(typeof data === 'object' && !data){
// 這里就是null了
}
undefined
JavaScript中第二個特殊的變量就是undefined浓镜。通過我們定義了一個變量溃列,但是沒有初始化的時候,此時這個變量的值即為undefined膛薛。我們可以在控制臺看下以下代碼
var name;
typeof name; //undefined
那么如果我們一個變量沒有定義听隐,通過typeof來看是什么呢?
從程序的邏輯上來講是合理的哄啄,但是從我們日常開發(fā)來講這樣就很難通過typeof 來判斷是未定義還是未初始化雅任。所以我們在日常開發(fā)中需要養(yǎng)成將變量定義的時候初始化的習慣,這樣我們才能通過typeof來判斷數(shù)據(jù)的正確性咨跌。
boolean
布爾類型沪么,只有兩個值,不同于上面兩個只有一個值锌半,他永遠只有true以及false兩種情況禽车。通常我們在需要判斷的時候都需要使用布爾值。雖然布爾值只有true和false兩個值刊殉,但是在javascript中所有的值都有跟這兩個值相對等的值殉摔。我們可以通過顯式的方法Boolean來獲取。那么哪些值會對應的是true呢记焊?將在下一章變量的轉換中有講解(又挖了一個坑)逸月。
string
字符串,在js中通過通過“”或者‘’來創(chuàng)建遍膜,例如
var name = '二鍋頭';
var name2 = "二鍋頭"彻采;
在js中字符串是不可變的。也就是說在js中如果創(chuàng)建了一個變量且初始化了后捌归,值是不能改變肛响,如果改變則是先銷毀原有的值,然后創(chuàng)建新值后賦值給原有變量惜索。其實不難理解特笋,在前面我們已經說過了,字符串是非引用類型,也就是說我們存儲的值是直接存儲在內存中的猎物,當我們要去改變的時候必然要先去清除原有的值虎囚,才能賦值。所以我們在執(zhí)行以下代碼的時候是什么樣的呢蔫磨?
var name="二鍋頭";
name += '淘讥,你好';
按照我們先銷毀再賦值的理論堤如,我們可以明顯知道蒲列,在執(zhí)行這代碼的時候,編輯器先創(chuàng)建一個6位的字符串搀罢,存儲二鍋頭蝗岖,你好然后將原有的name值的二鍋頭銷毀后再將6位的字符串賦值給name.在低版本的瀏覽器中我們其實能感受這個過程,因為在某些低版本瀏覽器中會很慢榔至。
number
數(shù)字抵赢,包括整數(shù)以及浮點數(shù)兩類。整個number類型本身是沒有什么可講解的唧取,其更多的是在數(shù)值轉換上铅鲤,我們將在下章講解。但是關于浮點數(shù)有一個很常見的問題枫弟,那就是浮點數(shù)的精度問題彩匕,我們來看一下代碼
0.1 + 0.2 === 0.3
在我們的認知中應該是true,但是實際上不是,實際上返回的值是false媒区。為什么呢驼仪?歸根到底就是因為精度問題,由于js的浮點數(shù)的精度是17位袜漩,所以其精度根本無法與整數(shù)相比绪爸。所以才會導致此類問題的出現(xiàn)。這個時候我們不僅僅要擔心宙攻,是不是浮點數(shù)都這樣奠货,大可不必,大多數(shù)的情況下數(shù)據(jù)是不會出現(xiàn)問題的座掘,那么我們如何能將上面的代碼變成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)建出一個對象邓馒。
至此我們關于js中的變量類型都已經說明完成了嘶朱,其實還有一個symbol對象沒有說明,此類型我們將在后面ES6篇章中詳細說明光酣。下一章我們將開啟類型轉換疏遏。敬請期待