您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在JavaScript中引用vs復(fù)制,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
let age = 18; let age2 = age; console.log(age, age2);
我們會得到以下的值:
18 18
這個相信大家都能很好理解。
那么如果我們改變 age 的值呢?輸出會有什么變化?
age = 20; console.log(age, age2);
我們會得到:
20 18
看到這里大家就奇怪了,上面的結(jié)果都很正常啊。
但在 JavaScript 中是有例外的,對于普通數(shù)據(jù)類型如 integer,string,boolean 可以通過 = 來復(fù)制這個變量,但對于 array 和 object 數(shù)據(jù)類型,= 只能起到引用的效果。
大家可以看下面這個例子:
let arr = ['wes', 'bob', 'faker']; let arr2 = arr; console.log(arr2, arr); arr[2] = 'dean'; console.log(arr2, arr);
得到的結(jié)果是:
["wes", "bob", "faker"] ["wes", "bob", "faker"]
["wes", "bob", "dean"] ["wes", "bob", "dean"]
我們會發(fā)現(xiàn)隨著 arr 的改變,arr2 也會跟著改變。
說明 arr2 并沒有復(fù)制 arr 的值,只是引用了它,它們都指向同一個內(nèi)存中的值。
object 也是一樣的:
let obj = { age: 19, name: 'like', last: 'jam' }; let obj2 = obj; console.log(obj, obj2); obj.age = 50; console.log(obj, obj2);
得到的結(jié)果是:
{age: 19, name: "like", last: "jam"} {age: 19, name: "like", last: "jam"}
{age: 50, name: "like", last: "jam"} {age: 50, name: "like", last: "jam"}
那么如何復(fù)制 array 和 object 呢?
復(fù)制 array 的方法:
方法1:
let arr2 = [].concat(arr);
方法2:
let arr2 = arr.slice();
方法3:
let arr2 = Array.from(arr);
方法4:
let arr2 = [...arr];
一般我們比較常用的是方法3和方法4,方法1和方法2比較取巧,但都是可以達(dá)到復(fù)制 array 的目的的。
ps: [...arr] 是 ES6 中的方法。
復(fù)制 object 的方法:
方法1:
let obj2 = Object.assign({}, obj);
方法2:
let obj2 = {...obj};
方法1和方法2都有個缺點(diǎn),它們只會復(fù)制對象的第一層。
看下面這個例子:
let obj = { number: 12, name: { first: 'bob', last: 'evil' } }; let obj2 = Object.assign({}, obj); obj.number = 50; console.log(obj, obj2);
我們會得到下面的結(jié)果:
obj = {
number: 50,
name: {
first: 'bob',
last: 'evil'
}
}obj2 = {
number: 12,
name: {
first: 'bob',
last: 'evil'
}
}
但如果我們改變第二層的值:
obj.name.first = 'sam'; console.log(obj, obj2);
obj = {
number: 50,
name: {
first: 'sam',
last: 'evil'
}
}obj2 = {
number: 12,
name: {
first: 'sam',
last: 'evil'
}
}
上述內(nèi)容就是怎么在JavaScript中引用vs復(fù)制,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。