前面的話
JavaScript的數據類型可以分為兩種:原始類型和引用類型
原始類型也稱為基本類型或簡單類型,因為其占據空間固定,是簡單的數據段,為了便於提升變量查詢速度,將其存儲在棧(stack)中(按值訪問)。其中,javascript基本數據類型包括Undefined、Null、Boolean、Number和String五種
引用類型由於其值的大小會改變,所以不能將其存放在棧中,否則會降低變量查詢速度,因此其存儲在堆(heap)中,存儲在變量處的值是一個指針,指向存儲對象的內存處(按址訪問)
[注意]對於引用類型的值,可以為其添加屬性和方法,也可以改變和刪除其屬性和方法;但基本類型不可以添加屬性和方法
Undefined
Undefined類型只有一個值,就是undefined。當聲明的變量未初始化時,該變量的默認值是undefined
var test;//undefined
console.log(test == undefined);//true
var test = undefined;//undefined
對於尚未聲明過的變量只能執行一項操作,使用typeof操作符檢測其數據類型,但嚴格模式下會導致錯誤
typeof(test);//undefined
出現場景
[1]已聲明未賦值的變量
[2]獲取對象不存在的屬性
[3]無返回值的函數的執行結果
[4]函數的參數沒有傳入
[5]void(expression)
類型轉換
Boolean(undefined): false
Number(undefined): NaN
String(undefined): 'undefined'
Null
Null類型只有一個值,就是null。邏輯角度看,null值表示一個空對象指針,如果定義的變量將用於保存對象,最好將該變量初始化為null。實際上undefined值是派生自null值的,所以undefined == null
[注意]null是空對象指針,而[]是空數組,{}是空對象,三者不相同
console.log(null == undefined);//true
出現場景
對象不存在時
類型轉換
Boolean(null): false
Number(null): 0
String(null): 'null'
[注意]因為undefined和null不是構造器類型,所以不能添加自定義屬性
包裝類型
包裝類型是特殊的引用類型。每當讀取一個基本類型值的時候,後台就會創建一個對應的基本包裝類型的對象,從而可能調用一些方法來操作這些數據。包裝類型共包括Boolean、Number和String三種
var s1 = 'some text';
var s2 = s1.substring(2);
//在上述過程中,實際上發生了三個步驟
var s1 = new String('some text'); //(1)創建String類型的一個實例
var s2 = s1.substring(2); //(2)在實例上調用指定的方法
s1 = null; //(3)銷毀這個實例
[注意]引用類型和基本包裝類型的主要區別是對象的生存期。使用new操作符創建的引用類型的實例,在執行流離開當前作用域之前都一直保存在內存中。而自動創建的基本包裝類型的對象,則只存在於一行代碼的執行瞬間,然後立即被銷毀。這意味著不能在運行時為基本類型值添加屬性和方法
var s1 = 'some text';
s1.color = 'red';
alert(s1.color);//undefined
創建方式
顯式創建包裝類型共兩種方式:
[1]Object方式[不建議使用]
var s = new Object('abc');
var b = new Object(true);
var n = new Object(123);
[2]構造函數方式[不建議使用]
var s = new String('abc');
var b = new Boolean(true);
var n = new Number(123);
[注意]使用new調用基本包裝類型的構造函數與直接調用同名的轉型函數是不一樣的
var value = '25';
var number = Number(value);
console.log(typeof number);//number
var obj = new Number(value);
console.log(typeof obj);//object
Boolean
Boolean類型只有兩個值:true 和 false。Boolean包裝類型是與布爾值對應的引用類型,在布爾表達式中使用Boolean對象容易造成誤解
出現場景
[1]條件語句導致系統執行的隱士類型轉換
[2]字面量或變量定義
類型轉換
Number(true): 1 || Number(false) : 0
String(true):'true' || String(false):'false'
Boolean()
Boolean(undefined):false
Boolean(null):false
Boolean(非空對象包括空數組[]和空對象{}):true
Boolean(非0): true || Boolean(0和NaN):false
Boolean(非空包括空格字符串):true || Boolean(''):false
[注意]true不一定等於1,false也不一定等於0
包裝類型繼承的方法
valueOf():返回基本類型值true 或 false
toString()和toLocaleString():返回字符串'true' 或'false'
console.log(typeof true.valueOf(),true.valueOf());//boolean true
console.log(typeof false.valueOf(),false.valueOf());//boolean false
console.log(typeof true.toString(),true.toString());//String 'true'
console.log(typeof false.toString(),false.toString());//String 'false'
console.log(typeof true.toLocaleString(),true.toLocaleString());//String 'true'
console.log(typeof false.toLocaleString(),false.toLocaleString());//String 'false'
Number
javascript只有一種數字類型,既可以表示32位的整數,還可以表示64位的浮點數
關於Number類型的詳細信息移步到此 http://www.linuxidc.com/Linux/2016-01/127130.htm
String
String類型是javascript中唯一沒有固定大小的原始類型
關於String類型的詳細信息移步至此 http://www.linuxidc.com/Linux/2016-01/127131.htm