JavaScript中,有七種內置類型:6種原始類型和引用類型,他們分別是:javascript
6種原始類型(基本類型):java
引用類型:segmentfault
咱們能夠用typeof
運算符來查看類型的值:安全
typeof(undefined) //"undefined" typeof('123') //"string" typeof(123) //"number" typeof(true) //"boolean" typeof Symbol() //"symbol" typeof({name:'oops'}) //"object" typeof([1,2,3]) //"object"
咱們注意到,null值並不在列,爲何呢?這裏比較特殊:oop
typeof(null) //"object" , 這是js中的一個bug
咱們應該使用正確的方法來判斷null值的類型:spa
var a = null; (!a && typeof a ==='object') //true
如今讓咱們來看另外一個問題:什麼是undefined?
答案是:變量在未持有值時,變量的類型爲undefined。
爲何我會在這裏會單獨提出這個問題?由於不少開發人員把undefined
等同於undeclared(未聲明)
,這是一個觀念性的錯誤。已在做用域中聲明的變量但未賦值的,稱爲undefined;相反,還未在做用域中聲明的變量,稱爲undeclared(未聲明)。
舉個栗子:指針
var a; a; //undefined c; //Uncaught ReferenceError: c is not defined
是否是突然明白了這二者的差異,BUT!!,請看這個栗子:code
var a; typeof a; //"undefined" typeof b; //"undefined"
奇怪,變量b未在做用域中聲明,爲何不報錯且typeof的值怎麼仍是undefined?那是由於typeof的一種特殊的安全機制。利用這點,當咱們用if條件語句判斷某個變量是否有值時,能夠用這種方法。舉個栗子:對象
//變量a未聲明,如下方式會報錯 if(a){ ... } //變量a未聲明,如下方式就是安全的 if( typeof a !== "undefined"){ ... }
so ,經過typeof檢查undeclared變量是個不錯的方法。blog
js中有六種基本類型,他們是:Undefined
、Null
、Boolean
、Number
、String
、Symbol (new in ES 6)
,基本類型的儲存方式爲棧內存(Stack)儲存,下圖所示。
由此得出如下三點結論;
舉個栗子:
var a = "oops"; b = a; b; //"oops" a = "哈哈"; a; //"哈哈" b; //"oops" ,a值的改變不會影響b的值
咱們先來一個栗子看看引用類型是如何在計算機內存儲的:
var a ={}; var b; a.name = "oops"; a.age = 24; b = a; console.log( b.age ); //24 a.name = "hz"; b.age = 18; console.log( a.age ) //18
從這個例子中能夠看出,引用類型的值是保存在堆內存(Heap)中的對象,棧內存保存變量的指針,堆內存中保存具體的對象。
作個小小的延伸:
var a ={name:"hz"}; var b ={name:"hz"}; console.log( a == b ); //false console.log( a === b ); //false
在這個栗子中,a,b兩個對象都有一條相同的值,但這兩個對象卻不相等,爲何呢?由於
a ,b 兩個對象分別引用的是存放在堆內存中的2個不一樣的對象,故變量 a和 b的值(引用地址)也是不同的。
以上。
有錯誤的地方但願你們指出來,共同探討。
參考資料:
【文章】 JavaScript 深刻了解基本類型和引用類型的值
【書籍】 你不知道的javascript(中卷) 第一章:類型