最近公司有一個項目出現(xiàn)了bug讓我去解決,發(fā)現(xiàn)之前的同事直接在函數(shù)里面修改了形參導致的問題那么Java Script可以直接修改函數(shù)的形參嗎心铃?
我們看一下下面的幾個例子准谚。
var a = 10;
function fn(a) {
a = 20;
console.log(a, arguments[0]); // 20 20
}
fn(a)
console.log(a) // 10
變量a沒有被修改
var param = {
name: 'Jack',
age: '18',
}
function fn(param){
param.name = "Lucy"
}
fn(param);
console.log(param.name) // Lucy
param.name被修改了。
這里面涉及到深克隆的問題去扣,Javascript數(shù)據(jù)類型分為基本數(shù)據(jù)類型(Number柱衔,String,Boolean愉棱,Undefined唆铐,Null)和引用數(shù)據(jù)類型(Object,Array奔滑,F(xiàn)unction)艾岂。基本數(shù)據(jù)類型的值存放在棧中朋其,將一個基本數(shù)據(jù)類型賦值給一個變量就是將他的值復制了一份王浴,引用數(shù)據(jù)類型的鏈接地址存放在棧中連接地址指向堆中的值,將引用類型復制一份其實是將他的鏈接賦值給新的變量兩個變量指向同一個值令宿。
再來看看forEach和map會不會修改原數(shù)據(jù)叼耙。
var student = [
{
name: 'Jack',
age: '18',
},
{
name: 'Lucy',
age: '20',
},
]
student.forEach((item) => { item.age = 25 })
console.log(student);
// { name: 'Jack', age: '25', },
// { name: 'Lucy', age: '25', },
student.map((item) => { item.age = 30 })
console.log(student);
// { name: 'Jack', age: '30', },
// { name: 'Lucy', age: '30', },
forEach和map的定義區(qū)別就是forEact沒有返回值map有返回值,forEach會修改原數(shù)據(jù)這道不奇怪粒没,奇怪的是map也修改了原數(shù)據(jù)這和map的設計思想不太一樣筛婉,這應該算是js的一種缺陷,在實際應用中使用map就是不想修改原數(shù)據(jù)因為map會返回一個新數(shù)組。如果不想原數(shù)據(jù)被改變可以使用這種方法爽撒。
const results = student.map((item) => ({ ...item, age: 30 }))