1.原始類型存儲簡單數據值,引用類型存儲對象,其本質是指向內存位置的應用。編程
注:其餘編程語言用棧存儲原始類型,用堆存儲引用類型。JavaScript原始值被保存在變量對象內,而引用值則做爲一個指針保存在變量對象內,該指針指向實際對象在內存中的存儲位置。數組
2.原始類型:boolean,number,string,null,undefined。原始類型的變量直接保存原始值(而不是一個指向對象的指針),也就是說,當你將原始值賦值給一個變量時,該值被複制到變量中,每個變量都有它本身的一份數據拷貝。框架
var name = '張三'; var age = 18; var show = true; var object = null; var flag = undefined; // 一個變量的改變並不會影響到其餘變量 var color1 = 'red'; var color2 = color1; console.log(color1); // red console.log(color2); // red color2 = 'blue'; console.log(color1); // red console.log(color2); // blue
3.引用類型:引用類型不在變量中保存對象,因此例子中的object變量實際上並不包含對象的實例,而是一個指向內存中實際對象所在位置的指針(或者說是引用)。這就意味着,當你將一個對象賦值給變量時,實際上賦值給這個變量的是一個指針。也就是說,這兩個變量指向內存中的同一個對象。編程語言
var object = new Object(); //保存指向內存中實際對象所在位置的指針
4.鑑別引用類型函數
instanceof操做符以一個對象和一個構造函數爲參數。若是對象是構造函數所指定的類型的一個實例,instanceof返回true;不然返回false。intanceof操做符可鑑別繼承類型,意味着全部的引用類型都繼承Object。指針
var items = []; var object = {}; function reflect(value){ return value; } console.log(items instanceof Array); // true console.log(object instanceof Object); // true console.log(reflect instanceof Function); // true
5.鑑別數組
當JavaScript的值在同一個頁面不一樣框架之間傳來傳去,再用instanceof來鑑別引用類型的時候,就可能出現問題,由於每個框架都有它本身的全局上下文--Object、Array以及其餘內建類型的版本。因此,當你把數組從一個框架傳到另外一個框架時,instanceof就沒法識別,由於該數組是來自不一樣框架的Array的實例。因此這個時候,得用Array.isArray()方法來鑑別數組,該方法只兼容IE9及以上。code
6.原始封裝類型
原始封裝類型共有3種,(String,Number和Boolean)。這些特殊引用類型的存在使得原始引用類型用起來和對象同樣方便。例如:對象
var name = '張三'; var firstChar = name.charAt(0); console.log(firstChar); // 張 // 背後發生的事情 var name = '張三'; var temp = new String(name); var firstChar = temp.charAt(0); temp = null; console.log(firstChar); // 張 var name = '張三'; name.last = '王五'; console.log(name.last); // undefined // 背後發生的事情 var name = '張三'; var temp = new String(name); temp.last = '王五'; temp = null; var temp = new String(name); console.log(temp.last); // undefined temp = null;