javascript中map會改變原始的數組嗎


其實這個問題應該不是說從map的角度去看,而是應該從數據的類型角度來看,

1、首先來看基本數組類型,例子如下所示:

在這個例子中,數組arr1 中的數據都是屬於基本數據類型,基本數據類型是按值進行訪問的,所以盡管對arr1中的item進行了操作,但是並不會改變原數組中的每一項

let arr1 = ['xugang','wangran']
arr1.map((item,index)=>{
	return item += 'good'
})
arr1 //arr1 = ['xugang','wangran']

 2、引用數據類型

引用數據是保存在堆中的,和基本數據類型不同的是,它不是按值訪問,而是按地址進行訪問

function changeFormat(arr) {
    arr.map((item, index) => {
    item.per = parseFloat(item.per)
    item.per = item.per / 10
  })
  return arr
}
let newarr = [{per: '12'}]
console.log(newarr) // [ { per: '12' } ]
console.log(changeFormat(newarr)) // [ { per: 1.2 } ]

 

基本數據類型和引用數據類型之間的其他區別:

1、聲明變量時不同的內存分配

       a、基本數據類型:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置。這是因為這些原始類型占據的空間是固定的,所以可將他們存儲在較小的內存區域 – 棧中。這樣存儲便於迅速查尋變量的值。

       b、引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。這是因為:引用值的大小會改變,所以不能把它放在棧中,否則會降低變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。地址的大小是固定的,所以把它存儲在棧中對變量性能無任何負面影響。

2、不同的內存分配機制也帶來了不同的訪問機制

      a、在javascript中是不允許直接訪問保存在堆內存中的對象的,所以在訪問一個對象時,首先得到的是這個對象在堆內存中的地址,然后再按照這個地址去獲得這個對象中的值,這就是傳說中的按引用訪問。

      b、而原始類型的值則是可以直接訪問到的。

3、復制變量時的不同

     a、原始值:在將一個保存着原始值的變量復制給另一個變量時,會將原始值的副本賦值給新變量,此后這兩個變量是完全獨立的,他們只是擁有相同的value而已。

     b、引用值:在將一個保存着對象內存地址的變量復制給另一個變量時,會把這個內存地址賦值給新變量,也就是說這兩個變量都指向了堆內存中的同一個對象,他們中任何一個作出的改變都會反映在另一個身上。(這里要理解的一點就是,復制對象時並不會在堆內存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針

4、參數傳遞的不同(把實參復制給形參的過程)

首先我們應該明確一點:ECMAScript中所有函數的參數都是按值來傳遞的。但是為什么涉及到原始類型與引用類型的值時仍然有區別呢?還不就是因為內存分配時的差別。

a、原始值:只是把變量里的值傳遞給參數,之后參數和這個變量互不影響。

b、引用值:對象變量它里面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心!因此它傳遞的值也就是這個內存地址,這也就是為什么函數內部對這個參數的修改會體現在外部的原因了,因為它們都指向同一個對象。


免責聲明!

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



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