js 原始數據類型、引用數據類型

js的數據類型劃分方式爲 原始數據類型和 引用數據類型

棧: 原始數據類型(Undefined,Null,Boolean,Number、String)

堆: 引用數據類型(對象、數組、函數)

兩種類型的區別:

存儲位置不一樣

原始數據類型直接存儲在棧(stack)中簡單數據段,佔據空間小,大小固定,屬於被頻繁使用的數據,因此存儲在棧中;
引用數據類型直接存儲在堆中,佔據空間大,大小不固定,若是存儲在棧中,將會影響程序運行的性能,引用數據類型在棧中存儲了指針,該指針指向堆中該實體的起始地址,當解釋器尋找引用值時,會首先檢索其在棧中的地址,取得地址後,從堆中得到實體。
javascript

傳值方式不一樣

按值傳遞(call by value)是最經常使用的求值策略:函數的形參是被調用時所傳實參的副本。修改形參的值並不會影響實參。html

按引用傳遞(call by reference)時,函數的形參接收實參的隱式引用,而再也不是副本。這意味着函數形參的值若是被修改,實參也會被修改。同時二者指向相同的值。java

按引用傳遞會使函數調用的追蹤更加困難,有時也會引發一些微妙的BUG。數組

按值傳遞因爲每次都須要克隆副本,對一些複雜類型,性能較低。兩種傳值方式都有各自的問題。函數

舉例:性能

var person,name;
    person = 'kn';
    name=person;
    person='黑白';
    console.log(person,name,typeof person)//黑白 kn string

person的改變沒有改變name,說明 string 是按值傳遞的。賦值時建立一塊新的內存空間指針

一、基本數據類型:按值傳遞code

不可變(immutable)性質
基本類型是不可變的(immutable),只有對象是可變的(mutable). 有時咱們會嘗試「改變」字符串的內容,但在JS中,任何看似對string值的」修改」操做,實際都是建立新的string值。任何方法都沒法改變一個基本類型的值,htm

var str = "abc";
     str[0]; // "a"
     str[0] = "d";
     console.log(str); //abc
     var name = 'jozo';
     var upName=name.toUpperCase(); 
     console.log(upName,name); // 輸出 'JOZO' 'jozo'

方法操做沒法改變一個基本類型的值對象

var person = 'kn';
     person.age = 24;
     person.method = function(){};
     console.log(person.age); // undefined
     console.log(person.method); // undefined

2.引用類型:按引用傳遞

引用類型的值是可變的

var obj = {x : 0};
     obj.x = 100;
     var o = obj;
     o.x = 1;
     console.log(obj.x)// 1, 被修改
    o = {x:100};  //等同於從新賦值,從新開闢內存,不是修改
    console.log(JSON.stringify(obj),JSON.stringify(o))//{"x":1} {"x":100}
    obj.x; // 1, 不會因o = {"x":100}改變

引用類型的值是同時保存在棧內存和堆內存中的對象

javascript和其餘語言不一樣,其不容許直接訪問內存中的位置,也就是說不能直接操做對象的內存空間,那咱們操做啥呢? 實際上,是操做對象的引用,
因此引用類型的值是按引用訪問的。
準確地說,引用類型的存儲須要內存的棧區和堆區(堆區是指內存裏的堆內存)共同完成,棧區內存保存變量標識符和指向堆內存中該對象的指針,
也能夠說是該對象在堆內存的地址。
假若有如下幾個對象:

var person1={name:"xiaoming"}
var person2={name:"xiaohong"}
var person3={name:"xiaoxiao"}

兩種數據類型在實參和形參中的區別

首先要明白什麼實參什麼是形參。
實參:能夠是常量、變量、表達式、函數等, 不管實參是何種類型的量,在進行函數調用時,它們都必須具備肯定的值, 以便把這些值傳送給形參。 所以應預先用賦值,輸入等辦法使實參得到肯定值。
形參:全稱爲「形式參數」是在定義函數名和函數體的時候使用的參數,目的是用來接收調用該函數時傳遞的參數。
形參的做用是實現主調函數與被調函數之間的聯繫,一般將函數所處理的數據,影響函數功能的因素或者函數處理的結果做爲形參。

function addNum(param)  //相對於addNum方法來講 param是形參
{ 
    param+=10; 
     return param; 
} 
var num=10;  
var result=addNum(num); //相對於addNum方法來講 num是實參
console.log(num);  //10  
console.log(result);//20

上面的例子中,當將 num做爲實參傳入方法 addNum是 param做爲形參接受 並在方法體內使用,且num在全局中沒用改變,但當實參爲引用類型時

function fun(param)  //相對於fun方法來講 param是形參
 { 
    param[0]=99; 
     return param; 
} 
 var num=[10];  
 var result=fun(num); //相對於fun方法來講 num是實參
 console.log(num[0]);  //99 
 console.log(result);//[99]

在方法體內改變形參,將同時改變實參

引用:
js原始數據類型和引用數據類型=>callback數據傳輸原理

相關文章
相關標籤/搜索