JavaScript數據類型

 

1、JavaScript數據類型主要分爲原始類型引用數據類型

 

  1. 原始類型包括(不可拆分的東西):Number、String、Boolean、Null、Undefined。引用數據類型包括:Object(Array,Date,RegExp,Function)
  2. typeof(undefined)返回undefined、typeof(null)返回object
  3. undefined 其實是從 null 派生來的,所以 ECMAScript 把它們定義爲相等的
  4. 引用數據類型也就是對戲那個類型Object type,好比:Object、Array、Function、Date、RegExp等
  5. undefined == null; // true undefined值是派生自null值的
    1 == true;   // true  比較值,容易理解 
    2 == true;   // false 比較的時候,true轉化成1,false轉化成0
    0 == false;  // true  
    0 == '';     // true 
    NaN == NaN;  // false NaN與任何值都不相等,包括NaN自己,
    [] == false; // true 
    [] == ![];   // true 引用類型  

JavaScript的引用數據類型是保存在堆內存中的對象,與其餘語言不一樣的是,你不能夠直接訪問堆內存空間中的位置和操做堆內存空間。只能操做對象在棧內存中的引用地址。javascript

2、隱式轉換

    把變量從字符串格式的數字轉換成數字類型:string - 0;java

    把變量從數字轉換成字符串類型:number + '';函數

    字符串、數值轉換成布爾類型:!!string、!!number;性能

    一樣的null和undefined也能夠轉換成布爾類型:!!null、!!undefined;spa

    Date類型轉換成Number類型:new Date().getTime();指針

3、包裝對象

基本類型中的Number、String和Boolean都有對應的包裝類型。code

var str = 'string'; // 原始類型
var strObj = new String(str); // 包裝類型
strObj.valueOf(); // 返回原始類型
var num = 123; // 原始類型
var numObj = new Number(num); // 包裝類型
numObj.valueOf(); // 返回原始類型
var boo = !!123;// 原始類型
var booObj = new Boolean(123); // 包裝類型
booObj.valueOf();// 返回原始類型

 

4、總結區別

  • 聲明變量時不一樣的內存分配:

1)原始值:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。這是由於這些原始類型佔據的空間是固定的,因此可將他們存儲在較小的內存區域 – 棧中。這樣存儲便於迅速查尋變量的值。對象

2)引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。這是由於:引用值的大小會改變,因此不能把它放在棧中,不然會下降變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,因此把它存儲在棧中對變量性能無任何負面影響。blog

  • 不一樣的內存分配機制也帶來了不一樣的訪問機制
1)在javascript中是不容許直接訪問保存在堆內存中的對象的,因此在訪問一個對象時,首先獲得的是這個對象在堆內存中的地址,而後再按照這個地址去得到這個對象中的值,這就是傳說中的按引用訪問
2)而原始類型的值則是能夠直接訪問到的。
  • 複製變量時的不一樣
1)原始值:在將一個保存着原始值的變量複製給另外一個變量時,會將原始值的副本賦值給新變量,此後這兩個變量是徹底獨立的,他們只是擁有相同的value而已
2)引用值:在將一個保存着對象內存地址的變量複製給另外一個變量時,會把這個內存地址賦值給新變量,也就是說這兩個變量都指向了堆內存中的同一個對象,他們中任何一個做出的改變都會反映在另外一個身上。
(這裏要理解的一點就是,複製對象時並不會在堆內存中新生成一個如出一轍的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針
  • 參數傳遞的不一樣(把實參複製給形參的過程
首先咱們應該明確一點:ECMAScript中全部函數的參數都是按值來傳遞的。
可是爲何涉及到原始類型與引用類型的值時仍然有區別呢?還不就是由於內存分配時的差異。 

1)原始值:只是把變量裏的值傳遞給參數,以後參數和這個變量互不影響。ip

2)引用值:對象變量它裏面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心!
所以它傳遞的值也就是這個內存地址,這也就是爲何函數內部對這個參數的修改會體如今外部的緣由了,由於它們都指向同一個對象。
相關文章
相關標籤/搜索