深刻了解JavaScript對象(1)--原始類型和引用類型

原始類型和引用類型

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;
相關文章
相關標籤/搜索