{ //不改变原数组的方法: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 就相当于是形参, 形参可能会改变实参, 类比上面结论可以得知: 如果实参是基本类型, 那确实改变不了实参; 如果实参是引用类型: 函数修改了形参的地址值或将其修改为基本类型, 改变不了实参 函数没有修改形参的地址值, 只是修改形参内部的某些属性, 会改变实参 */ }