赞
踩
forEach是可以改变原数组的???,但是,为什么现在这么简单的字符串数字组成的数组,咋就永远原数组???
可以,如果使用的是:数组操作的都是对象数组-----可以改变,如果是数字字符串数组----不可以改变,原因:原来是因为是引用类型与基本数据类型的区别呀!
1、基本数据类型 -> 不改变原数组
- const array = [1, 2, 3, 4];
- array.forEach(ele => {
- ele = ele * 3
- })
- console.log(array); // [1,2,3,4]
2、引用类型 -> 类似对象数组可以改变
- const objArr = [{
- name: 'wxw',
- age: 22
- }, {
- name: 'wxw2',
- age: 33
- }]
- objArr.forEach(ele => {
- if (ele.name === 'wxw2') {
- ele.age = 88
- }
- })
- console.log(objArr); // [{name: "wxw", age: 22},{name: "wxw2", age: 88}]
3、那引用类型 -> 改变整个单次循环的item那? -> 不能改变
- const ar2= [{
- name: 'wxw',
- age: 22
- }, {
- name: 'wxw2',
- age: 33
- }]
- ar2.forEach(ele => {
- if (ele.name === 'wxw2') {
- ele = {
- name: 'change',
- age: 77
- }
- }
- })
- console.log(ar2); // [{name: "wxw", age: 22},{name: "wxw2", age: 33}]
4、终极无敌屡试不爽的方法!
- // 基本类型可以~
- const arr= [33,4,55];
- numArr.forEach((ele, index, arr) => {
- if (ele === 33) {
- arr[index] = 999
- }
- })
- console.log(arr); // [999, 4, 55]
-
- // 引用类型也可以~
- const arr1= [{
- name: 'wxw',
- age: 22
- }, {
- name: 'wxw2',
- age: 33
- }]
- arr1.forEach((ele, index, arr) => {
- if (ele.name === 'wxw2') {
- arr[index] = {
- name: 'change',
- age: 77
- }
- }
- })
- console.log(arr1); // // [{name: "wxw", age: 22},{name: "change", age: 77}]
总结一下
基本类型我们当次循环拿到的ele,只是forEach给我们在另一个地方复制创建新元素,是和原数组这个元素没有联系的!所以,我们使命给循环拿到的ele赋值都是无用功!
总的来说:JavaScript是有基本数据类型与引用数据类型之分的。对于基本数据类型:它们在栈内存中直接存储变量与值。而Object对象的真正的数据是保存在堆内存,栈内只保存了对象的变量以及对应的堆的地址,所以操作Object其实就是直接操作了原数组对象本身。
forEach 的基本原理也是for循环,使用arr[index]的形式赋值改变,无论什么就都可以改变了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。