< p>今天我們來談一下javascript中的引用賦值問題。在javascript中,賦值分為值賦值和引用賦值兩種。值賦值是將一個(gè)變量的值拷貝到另一個(gè)變量中,而引用賦值則是將一個(gè)變量的地址賦給另一個(gè)變量,也就是兩個(gè)變量指向同一個(gè)對象。下面我們就來詳細(xì)介紹引用賦值的相關(guān)問題。< /p>< p>引用賦值最常見的場景是在函數(shù)中使用對象作為參數(shù),因?yàn)樵贘avaScript中,函數(shù)參數(shù)傳遞都是按照引用傳遞的。下面看一個(gè)例子:< /p>
const obj1 = { name: 'Chen', age: 18 } const obj2 = obj1 console.log(obj1 === obj2) // true obj2.age = 20 console.log(obj1) // { name: 'Chen', age: 20 }< p>在這個(gè)例子中,我們將obj1的引用賦值給了obj2,因此它們指向同一個(gè)對象。那么當(dāng)obj2的屬性值改變時(shí),obj1的屬性值也會(huì)改變。如果我們想要拷貝一個(gè)對象,可以使用Object.assign()方法,如下所示:< /p>
const obj1 = { name: 'Chen', age: 18 } const obj2 = Object.assign({}, obj1) console.log(obj1 === obj2) // false obj2.age = 20 console.log(obj1) // { name: 'Chen', age: 18 }< p>在這個(gè)例子中,我們使用Object.assign()方法將obj1拷貝到了一個(gè)新的對象中,而這個(gè)新的對象是不會(huì)改變原有對象的值的。< /p>< p>除了函數(shù)中的參數(shù)傳遞,變量賦值也會(huì)涉及到引用賦值的問題。下面看一個(gè)例子:< /p>
const arr1 = [1, 2, 3] const arr2 = arr1 console.log(arr1 === arr2) // true arr2.push(4) console.log(arr1) // [1, 2, 3, 4]< p>在這個(gè)例子中,我們將arr1的引用賦值給了arr2,因此它們指向同一個(gè)數(shù)組。那么當(dāng)我們通過arr2改變數(shù)組時(shí),arr1也會(huì)發(fā)生變化。如果我們想要拷貝一個(gè)數(shù)組,可以使用slice()方法,如下所示:< /p>
const arr1 = [1, 2, 3] const arr2 = arr1.slice() console.log(arr1 === arr2) // false arr2.push(4) console.log(arr1) // [1, 2, 3]< p>在這個(gè)例子中,我們使用slice()方法將arr1拷貝到了一個(gè)新的數(shù)組中,而這個(gè)新的數(shù)組是不會(huì)改變原有數(shù)組的值的。< /p>< p>總結(jié):在javascript中,引用賦值是指將一個(gè)變量的地址賦給另一個(gè)變量,也就是兩個(gè)變量指向同一個(gè)對象。這種賦值方式在函數(shù)參數(shù)傳遞和變量賦值時(shí)十分常見。如果我們想要拷貝一個(gè)對象或一個(gè)數(shù)組,可以使用Object.assign()方法、slice()方法或其他一些方法來實(shí)現(xiàn)。< /p>