js中的基本類型和引用類型


基本數據類型:按值訪問,可操作保存在變量中的實際的值。基本類型值指的是簡單的數據段。

基本數據類型有這六種: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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM