?
一、JavaScript數據類型主要分為原始類型和引用數據類型。
?
- 原始類型包括(不可拆分的東西):Number、String、Boolean、Null、Undefined。引用數據類型包括:Object(Array,Date,RegExp,Function)
- typeof(undefined)返回undefined、typeof(null)返回object
- undefined 實際上是從 null 派生來的,因此 ECMAScript 把它們定義為相等的
- 引用數據類型也就是對戲那個類型Object type,比如:Object、Array、Function、Date、RegExp等
-
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的引用數據類型是保存在堆內存中的對象,與其他語言不同的是,你不可以直接訪問堆內存空間中的位置和操作堆內存空間。只能操作對象在棧內存中的引用地址。
二、隱式轉換
把變量從字符串格式的數字轉換成數字類型:string - 0;
把變量從數字轉換成字符串類型:number + '';
字符串、數值轉換成布爾類型:!!string、!!number;
同樣的null和undefined也可以轉換成布爾類型:!!null、!!undefined;
Date類型轉換成Number類型:new Date().getTime();
三、包裝對象
基本類型中的Number、String和Boolean都有對應的包裝類型。
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();// 返回原始類型
?
四、總結區別
- 聲明變量時不同的內存分配:
1)原始值:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。這是因為這些原始類型占據的空間是固定的,所以可將他們存儲在較小的內存區域 – 棧中。這樣存儲便于迅速查尋變量的值。
2)引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負面影響。
- 不同的內存分配機制也帶來了不同的訪問機制
- 復制變量時的不同
- 參數傳遞的不同(把實參復制給形參的過程)
1)原始值:只是把變量里的值傳遞給參數,之后參數和這個變量互不影響。