{ //不改變原數組的方法:concat(),join(),slice(),toString() let arr1 = [1,2],arr2=[3,4],arr3 = [1,2,3,4,5,6]; console.log(arr1.concat(arr2),arr1,arr2) //[1, 2, 3, 4] [1, 2] [3, 4] 不改變原數組,返回新的數組 console.log(arr3.join(','),arr3) // [1, 2, 3, 4, 5, 6] "1,2,3,4,5,6" 不改變原數組,返回字符串 console.log(arr3.slice(0,4),arr3) //[1, 2, 3, 4] [1, 2, 3, 4, 5, 6] 不改變原數組,返回一個新數組 console.log(arr3.toString(arr3),arr3) //1,2,3,4,5,6 [1, 2, 3, 4, 5, 6] 不改變原數組,返回數組的字符串形式 //改變原數組的方法:push(),pop(),unshift(),shift(),reverse(),sort(),splice() console.log(arr1.push(6),arr1);//3 [1, 2, 6] 向數組的末尾添加一個或多個元素,改變原數組,返回新數組的長度 console.log(arr1.pop(),arr1) //6 [1, 2] 刪除數組最后一個元素,如果數組為空,則不改變數組,返回undefined,改變原數組,返回被刪除的元素 console.log(arr1.unshift(3,5),arr1) //4 [3, 5, 1, 2] 向數組的開頭添加一個或多個元素,改變原數組,返回新數組的長度 console.log(arr1.shift(3,5),arr1) //3 [5, 1, 2] 向數組的開頭刪除一個或多個元素,改變原數組,返回新數組的長度 console.log(arr2,arr2.reverse(3,5)) //[4, 3] [4, 3] 顛倒數組中元素的順序,改變原數組,返回該數組 console.log(arr2,arr2.sort()) //[3, 4] [3, 4] 改變原數組,返回該數組 console.log(arr2,arr2.splice(0,1,9)) //[9, 4] [3] 改變原數組,返回被刪除的元素 } { //循環數組 let arr = [1,2,3,4,5,6]; //數組的內容為基本類型 arr.forEach(item => { item = 99; }) console.log(arr); //[1,2,3,4,5,6] 無法改變原數組的值 arr.forEach((item,index) => { arr[index] = 99; }) console.log(arr); //[99,99,99,99,99,99] 可以用下標改變原數組的值 // ------------------------------------------------------------------------ let arr2 = [{name:'張三',age:18},{name:'李四',age:19},{name:'王五',age:20}]; //數組的內容為引用類型 arr2.forEach(item=>{//item 都是原數組所對應的對象的地址值 item = 465;//此時修改的只是引用類型的地址,而未修改其值,原數組的值並不會改變 }) console.log(arr2)//[{name:'張三',age:18},{name:'李四',age:19},{name:'王五',age:20}] arr2.forEach(item=>{//item 都是原數組所對應的對象的地址值 item.age++;//此時修改的其地址所對應堆的值,會改變其原數組的值 }) console.log(arr2)//[{name:'張三',age:19},{name:'李四',age:20},{name:'王五',age:21}] /* 總結:其實 forEach 和 map 的最大共同點就是都是函數, item 就相當於是形參, 形參可能會改變實參, 類比上面結論可以得知: 如果實參是基本類型, 那確實改變不了實參; 如果實參是引用類型: 函數修改了形參的地址值或將其修改為基本類型, 改變不了實參 函數沒有修改形參的地址值, 只是修改形參內部的某些屬性, 會改變實參 */ }