JavaScript
的數據類型分爲兩大類,分別爲基本數據類型和引用數據類型。數組
基本類型又叫值類型或者簡單類型,包括null
,undefined
,boolean
,string
,number
,symbol
。 引用類型又叫複雜類型或者對象類型,包括Object
,Array
,Date
,Function
,Map
,Set
等。瀏覽器
不一樣的是基本類型的值存儲在棧內存中,按值訪問。引用類型存儲在堆內存中,按引用(地址、指針)訪問。函數
舉個例子:測試
// 基本類型
var a = 5;
var b = a;
b = 8;
console.log(a,b); // 5 8
// 引用類型
var c = { text: 'Hello World!' };
var d = c;
d.text = 'Hi!';
console.log(c.text, d.text); // Hi! Hi!
複製代碼
typeof
能夠用來檢測給定變量的數據類型,它會返回一個表示數據類型的字符串,可能返回7種結果:number
、string
、boolean
、undefined
、symbol
、object
、function
。ui
typeof 123; // number
typeof '123'; // string
typeof true; // boolean
typeof undefined; // undefined
typeof Symbol(); // symbol
typeof null; // object
typeof {}; // object
typeof function () {} // function
複製代碼
typeof
對於基本類型來講,除了null
均可以顯示正確的類型。對於引用類型來講,除了函數都會顯示object
。因此說能夠用typeof
來判斷基本數據類型,可是要注意null
的狀況。this
null
返回object
是緣由是這樣的:JavaScript
中不一樣的值在底層都表示爲二進制,object
在二進制中前三位對應的值是000
。而null
在二進制中32位都是0
,天然前三位也是0
。因此typeof null
會返回object
。spa
typeof
能夠用來檢測基本類型,可是檢測引用類型時並不能返回具體的數據類型,這個時候能夠用instanceof
。instanceof
是經過原型鏈去判斷的,經過測試左邊對象的原型鏈上是否有右邊這個對象構造函數的prototype
屬性來判斷的。表達式爲:A instanceof B
,即判斷A
是否爲B
的實例,是則返回true
,不然返回false
。prototype
[] instanceof Array; // true
{} instanceof Object; // true
new Function() instanceof Function; // true
new Date() instanceof Date; // true
new Map() instanceof Map; // true
new Set() instanceof Set; // true
// 數組還能夠用ES6新增的Array.isArray()來判斷
Array.isArray([]); // true
// instanceof 還能夠測試自定義類型
function Person(){};
new Person() instanceof Person; // true
new Person() instanceof Object; // true
複製代碼
值得注意的是全部引用類型用instanceof檢測Object都會返回true,這是由於引用數據類型的原型鏈上都存在有Object屬性。即全部引用類型的數據都是Object的實例。 指針
另外,基本數據類型不能經過instanceof
來判斷。code
下面來簡單實現一下instanceof
function myInstanceof(A, B) {
var A = A.__proto__;
var B = B.prototype;
while (1) {
if (A === null) return false;
else if (A === B) return true;
A = A.__proto__;
}
}
複製代碼
constructor
即構造函數,做用和instanceof
很是類似。它的做用是,能夠檢測實例對象是由哪個構造函數產生的。它也能夠檢測基本數據類型。可是若是重寫prototype
,constructor
能夠會被改變。
function F(){};
var f = new F();
f.constructor === F; // true
// 重寫prototype
F.prototype = { a: '' };
var f1 = new F();
f1.constructor === F; // false
// 重寫原型時能夠給constructor賦值,這樣就不會被改變
F.prototype = {
constructor: F,
a: '',
};
var f2 = new F();
f2.constructor === F; // true
// 基本類型
var num = 1;
num.constructor === Number; // true
'1'.constructor === String; // true
true.constructor === Boolean; // true
Symbol().constructor === Symbol; // true
// 對於特殊的null和undefined,瀏覽器並不容許在外面訪問使用,因此不能用constructor來判斷
複製代碼
這個是檢測數據類型最推薦最經常使用的方法,能夠更加準確地判斷任何數據類型。toString
是Object
原型對象上的一個方法,這個方法默認返回其調用者的具體類型,用call
改變方法中的this
關鍵字的指向,而後返回當前方法的執行主體(方法中this
)所屬類的詳細信息,返回格式爲[object String]
。
toString.call(''); // [object String]
toString.call(1); // [object Number]
toString.call(null); // [object Null]
toString.call(undefined); // [object Undefined]
toString.call(true); // [object Boolean]
toString.call(Symbol()); // [object Symbol]
toString.call({}); // [object Object]
toString.call([]); // [object Array]
toString.call(new Function()); // [object Function]
toString.call(new Date()); // [object Date]
toString.call(new Map()); // [object Map]
toString.call(new Set()); // [object Set]
toString.call(new Error()); // [object Error]
複製代碼
JavaScript
是一種弱類型的語言,也能夠說是動態類型的語言。動態類型,就是一個變量能夠被賦予不一樣的數據類型,能夠根據使用場景來變化,在計算時能夠隱式轉換它的類型。
與之不一樣的是強類型語言(強制數據類型定義的語言),也就是說,若是一個變量被指定了某一個數據類型,那它就一直是這個數據類型。舉個例子:若是變量a被指定爲整形,那麼它就不能做爲字符串來使用。如Java
、Python
就是強類型定義語言。
var num = 1;
console.log(typeof num); // number
num = '1';
console.log(typeof num); // string
num = true;
console.log(typeof num); // boolean
num = new Date();
console.log(typeof num); // object
console.log(1 + '1'); // 11
console.log(1 + true); // 2
複製代碼
數據轉換的三種狀況
布爾表示一種邏輯實體,能夠有兩個值:true
和false
。在條件判斷時,false
、''
、null
、undefined
、NaN
、0
、-0
這些值爲false
,其餘都爲true
。
// (1)數字
(11).toString(10); // '11' // 對應的字符串
(12).toString(2); // '1100' // 能夠轉換爲不一樣的進制
// (2)數組
[1, 2].toString(); // '1,2'
// (3)對象
({}).toString(); // [object Object] // 都會轉換爲[object Object]
// (4)其餘
true.toString(); // 'true' // 對應的字符串
複製代碼
// (1)字符串
Number('1'); // 1
Number('a'); // NaN
// (2)boolean
Number(true); // 1 // true轉1,false轉0
// (3)null
Number(null); // 0
// (4)undefined
Number(undefined); // NaN
// (5)symbol
Number(Symbol()) // 報錯
// (6)數組
Number([]); // 0 // 空數組轉爲0
Number([1]); // 1 // 存在一個元素則將這個元素轉爲數字
Number([1, 2]); // NaN //存在多個元素則轉換爲NaN
// (7)除了數組的引用類型
Number({}); // NaN
複製代碼
一、JavaScript
的數據類型分爲兩大類:基本類型和引用類型。
二、判斷數據類型的四種方法:typeof
、instanceof
、constructor
、Object.prototype.toSting.call()
。
3JavaScript
數據轉換的三種狀況:轉換爲布爾值、字符串或者數字。