当前位置:   article > 正文

forEach到底可以改变原数组?_foreach会不会改变原数组

foreach会不会改变原数组

forEach是可以改变原数组的???,但是,为什么现在这么简单的字符串数字组成的数组,咋就永远原数组???

可以,如果使用的是:数组操作的都是对象数组-----可以改变,如果是数字字符串数组----不可以改变,原因:原来是因为是引用类型与基本数据类型的区别呀!

二. 详解

1、基本数据类型 -> 不改变原数组

  1. const array = [1, 2, 3, 4];
  2. array.forEach(ele => {
  3. ele = ele * 3
  4. })
  5. console.log(array); // [1,2,3,4]

2、引用类型 -> 类似对象数组可以改变

  1. const objArr = [{
  2. name: 'wxw',
  3. age: 22
  4. }, {
  5. name: 'wxw2',
  6. age: 33
  7. }]
  8. objArr.forEach(ele => {
  9. if (ele.name === 'wxw2') {
  10. ele.age = 88
  11. }
  12. })
  13. console.log(objArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 88}]

3、那引用类型 -> 改变整个单次循环的item那? -> 不能改变

  1. const ar2= [{
  2. name: 'wxw',
  3. age: 22
  4. }, {
  5. name: 'wxw2',
  6. age: 33
  7. }]
  8. ar2.forEach(ele => {
  9. if (ele.name === 'wxw2') {
  10. ele = {
  11. name: 'change',
  12. age: 77
  13. }
  14. }
  15. })
  16. console.log(ar2); // [{name: "wxw", age: 22},{name: "wxw2", age: 33}]

4、终极无敌屡试不爽的方法!

  1. // 基本类型可以~
  2. const arr= [33,4,55];
  3. numArr.forEach((ele, index, arr) => {
  4. if (ele === 33) {
  5. arr[index] = 999
  6. }
  7. })
  8. console.log(arr); // [999, 4, 55]
  9. // 引用类型也可以~
  10. const arr1= [{
  11. name: 'wxw',
  12. age: 22
  13. }, {
  14. name: 'wxw2',
  15. age: 33
  16. }]
  17. arr1.forEach((ele, index, arr) => {
  18. if (ele.name === 'wxw2') {
  19. arr[index] = {
  20. name: 'change',
  21. age: 77
  22. }
  23. }
  24. })
  25. console.log(arr1); // // [{name: "wxw", age: 22},{name: "change", age: 77}]

总结一下
基本类型我们当次循环拿到的ele,只是forEach给我们在另一个地方复制创建新元素,是和原数组这个元素没有联系的!所以,我们使命给循环拿到的ele赋值都是无用功!

总的来说:JavaScript是有基本数据类型与引用数据类型之分的。对于基本数据类型:它们在栈内存中直接存储变量与值。而Object对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。

forEach 的基本原理也是for循环,使用arr[index]的形式赋值改变,无论什么就都可以改变了。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号