基本數據類型:按值訪問,可操作保存在變量中的實際的值。基本類型值指的是簡單的數據段。
基本數據類型有這六種:undefined、null、string、number、boolean、symbol(es6)。
引用類型:當復制保存着對象的某個變量時,操作的是對象的引用,但在為對象添加屬性時,操作的是實際的對象。引用類型值指那些可能為多個值構成的對象。
引用類型有這幾種:Object、Array、RegExp、Date、Function、特殊的基本包裝類型(String、Number、Boolean)以及單體內置對象(Global、Math)。
對於基本類型值和引用類型值的區別:
① 引用類型值可添加屬性和方法,而基本類型值則不可以。
//為引用類型值添加屬性 var p = new Object(); p.age=11; alert(p.age);//11 //為基本類型值添加屬性 var name = 'a'; name.age = 11; alert(name.age); //undefined
② 在復制變量值時,基本類型會在變量對象上創建一個新值,再復制給新變量。此后,兩個變量的任何操作都不會影響到對方。而引用類型在創建一個對象類型時,計算機會在內存中開辟一個空間來存放值,我們要找到這個空間,需要知道這個空間的地址,變量存放的就是這個地址,復制變量時其實就是將地址復制了一份給新變量,兩個變量的值都指向存儲在堆中的一個對象,也就是說,其實他們引用了同一個對象,改變其中一個變量就會影響到另一個變量。
//基本類型值 var a = 'a'; var b = a; a = 'b'; alert(b); //a
引用類型值,以數組為例:
//引用類型值,以數組為例 //1.對其中一個變量直接賦值不會影響到另一個變量(並未操作引用的對象) var a = [1,2,3]; var b = a; a = [1,2,3,4]; alert(a);//1,2,3,4 alert(b); //1,2,3 //2.使用push(操作了引用的對象) var a = [1,2,3]; var b = a; a.push(4); alert(a);//1,2,3,4 alert(b); //1,2,3,4
傳遞參數:按值傳遞,將函數外部的值復制給函數內部的參數(一個局部變量),當對局部變量進行操作時,局部變量的變化會反應在函數外部,但是這並不會影響函數外部的值。
function add(a){ a += 10; return a; } var num = 10; var result = add(num); alert(num); //10 alert(result); //20
當然,使用對象時可能會不好理解:
function setName(obj){ obj.name = 'a'; } var p = new Object(); setName(p); alert(p.name); //a
明明參數是按值傳遞的,為什么創建的p實例也能獲取到在setName()中添加的name屬性呢?
因為obj和p引用的是同一個對象,即便按值傳遞,obj也會按引用來訪問同一個對象。看一下下面的例子就能清楚了。
function setName(obj){ obj.name = 'a'; obj = new Object(); obj.name = 'b'; return obj; } var p = new Object(); var p2 = setName(p); alert(p.name); // a alert(p2.name); // b
在函數內部重寫obj對象,此時obj對象引用的是一個局部對象,外部的p還是原始的引用,因此不會改變。
檢測類型:
typeof:確定變量是字符串、數值、布爾值還是undefined的最佳工具。
var num = 1; var a = 'a'; var b; var flag = true; var o = null;
var fn = function(){};
var rg = /hello/; alert(typeof num); //number alert(typeof a); //string alert(typeof b); //undefined alert(typeof flag); //boolean alert(typeof o); //object
alert(typeof fn); //function
alert(typeof rg); //object(sarari5、chrome7前返回function)
instanceof :判斷是否是某個對象類型。
var a = [1,2,3]; alert(a instanceof Object); //true alert(a instanceof Array); //true alert(a instanceof RegExp); //false