数组哪些方法能改变原数组,以及循环改变数组的情况

    {
        //不改变原数组的方法: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 就相当于是形参, 形参可能会改变实参, 类比上面结论可以得知:

        如果实参是基本类型, 那确实改变不了实参;

        如果实参是引用类型:

        函数修改了形参的地址值或将其修改为基本类型, 改变不了实参

        函数没有修改形参的地址值, 只是修改形参内部的某些属性, 会改变实参
     */
    }
不停学习,热爱是源源不断的动力。
原文地址:https://www.cnblogs.com/ximenchuifa/p/15209565.html