JavaScript數據類型----原始類型與引用類型(object)詳談

JavaScript中,有七種內置類型:6種原始類型和引用類型,他們分別是:javascript

6種原始類型(基本類型):java

  • 空值(null)
  • 未定義(undefined)
  • 布爾值(boolean)
  • 數字(number)
  • 字符串(string)
  • 符號(symbol,ES6中新增)

引用類型:segmentfault

  • 對象(object)

類型判斷

咱們能夠用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中有六種基本類型,他們是:UndefinedNullBooleanNumberStringSymbol (new in ES 6),基本類型的儲存方式爲棧內存(Stack)儲存,下圖所示。
基本類型的變量是存放在棧內存(Stack)裏的

由此得出如下三點結論;

  1. 基本類型的值是不可變的
  2. 基本類型的比較是它們的值的比較
  3. 基本類型的變量是存放在棧內存(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)中的對象(Object)

從這個例子中能夠看出,引用類型的值是保存在堆內存(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(中卷) 第一章:類型

相關文章
相關標籤/搜索