JS淺談原始值與引用值操作


值的操作分為三大類:復制,傳遞,比較

一:復制

原始值
let a = 10;
let b = a;
注釋:2018-7-30 17:33:49
1 原始類型的值都是存放在棧內存當中,所以他們的賦值操作,其實相當於在棧內存開辟新的空間,然后將值的副本賦給新的內存,所以他們互不干擾

引用值
let obj = {
    name:'panrui'
};
let obj1 = obj;
1 引用類型的值是存放在堆內存當中,棧內存中變量保存的只是一個堆內存的地址,所以賦值操作,也是開辟一個新的棧內存,然后將地址賦值給新的內存,由於兩個變量對應的地址指向同一個地方,所以他們會互相影響 2 tip:如果給變量賦值新值呢
    2.1
    obj1 = 6
    console.log(obj) //{name:'panrui'} 並不會影響
    2.2
    obj = 6
    console.log(obj1) //{name:'panrui'} 並不會影響
    重復賦值實際上是覆蓋變量對原值的引用,變為另一個值的副本或對其引用。所以不會對原值產生影響

 

二:傳遞

原始值
let a = 10;
function f(x){
    x= x + x
}
f(a)
console.log(a) // 10 
注釋:說明傳遞和賦值其實是一樣的,都是傳遞值的副本,互不影響


引用值
let obj = {
    name:'panrui'
};
function a(a){
    a.name = 'hello'
}
function(obj)
console.log(obj) // {name:'hello'}  因為傳遞的地址指向的同一個引用,所以互相影響

注釋:說明不管是基本類型,還是引用類型都是按值傳遞的,引用類型傳遞的是地址,基本類型傳遞的值的副本
function a(a){
    a.name = 'hello';
    a = new Object(); 
    a.name = 'hah';
    console.log(a) //{name:'hah'} 相當於重新賦值,這時候a在棧內存保存的是另外一個值的副本或者新的地址
    
}
a(obj)
console.log(obj) //{name:'hello'}

 

三:比較值

原始值
let a = 'hello'
let b = 'hello'
a === b //true
注釋:當對原始值進行比較時,進行逐字節的比較來判斷它們是否相等。比較的是值本身,而不是值所處的位置,固然比較的結果可能會相等,
但只是說明它們所包含的字節信息是相同的



引用值
let a = new Number(1);
let b = new Number(1);
a === b //false

let c = a;
a === c //true

注釋:當比較兩個引用值時,比較的是兩個引用地址,而不是比較它們的原值字節是否相等

 


免責聲明!

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



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