【深入探讨】JavaScript 中的 forEach 和 map 区别

这篇具有很好参考价值的文章主要介绍了【深入探讨】JavaScript 中的 forEach 和 map 区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🐱 个人主页:不叫猫先生,公众号:前端Clodplay
🙋‍♂️ 作者简介:前端领域优质作者、阿里云专家博主,共同学习共同进步,一起加油呀!
✨优质专栏:VS Code插件开发极速入门
📢 资料领取:前端进阶资料可以找我免费领取

【深入探讨】JavaScript 中的 forEach 和 map 区别,javascript,开发语言,map,forEach

区别

map会返回一个新的数组,而forEach不会具体探讨一下,实则会有新的发现!

下面来探讨一下原因

手写 map 和 forEach

手写map,如下:

function myMap(array, callback) {
  //存储结果
  const result = [];
  for (let i = 0; i < array.length; i++) {
    result.push(callback(array[i], i, array));
  }
  return result;
}

调用上面的myMap函数

// 定义一个回调函数,用于对数组元素进行操作
function double(value) {
  return value * 2;
}

// 定义一个数组
const numbers = [1, 2, 3, 4, 5];

// 调用 myMap 函数,并传入定义好的回调函数
const doubledNumbers = myMap(numbers, double);

console.log(doubledNumbers); // 输出 [2, 4, 6, 8, 10]

手写forEach,如下:

function myForEach(array, callback) {
  for (let i = 0; i < array.length; i++) {
    callback(array[i], i, array);
  }
}

调用上面的myForEach函数

// 定义一个回调函数,用于对数组元素进行操作
function logItem(item, index) {
  console.log(`Index ${index}: ${item}`);
}

// 定义一个数组
const fruits = ["Apple", "Banana", "Orange", "Mango"];

// 调用 myForEach 函数,并传入定义好的回调函数
myForEach(fruits, logItem);

总结:
上面可以看到 forEach 和 map 的实现原理相似。它们都是通过遍历数组,对数组的每个元素执行特定的函数。区别主要在于它们处理函数返回值的方式不同
forEach 忽略函数的返回值,而 map 则将函数的返回值收集到一个新的数组中

可以看到 map 和 forEach都会有一个for循环处理,且map有return

 for (let i = 0; i < array.length; i++) {
    result.push(callback(array[i], i, array));
  }
for (let i = 0; i < array.length; i++) {
    callback(array[i], i, array);
  }

那么能不能forEach也return,测试一下

        const array = [1, 2, 3]

        const result = array.forEach((element) => {
            return element * 2; // 这个返回值不会被 forEach 捕获或使用
        });

        console.log(result); // 输出: undefined

但是map,return 之后是有值的

        const array = [1, 2, 3]

        const result = array.map((element) => {
            return element * 2; // 这个返回值会被 map 捕获或使用
        });

        console.log(result); // 输出: [2, 4, 6]

map 和 forEach 会不会改变原数组

map 和 forEach 会不会改变原数组,需要看数据类型,具体分为基础数据类型和引用类型。

处理基本类型数据

forEach 处理基本数据类型

        let array = [1, 2, 3, 4];
        array.forEach(item => {
            item = item + 1
        })
        console.log(array); // [1,2,3,4]

map 处理基本数据类型

        let array = [1, 2, 3, 4];
        array.map(item => {
            item = item + 1
        })
        console.log(array); // [1,2,3,4]

测试后发现,都没有改变原数组

处理引用类型数据

forEach 处理引用类型数据

        const arr = [{
            name: 'shaka',
            age: 23
        }, {
            name: 'virgo',
            age: 18
        }]
        arr.forEach(item => {
            if (item.name === 'shaka') {
                item.age = 100
            }
        })
        console.log(arr); //[{name: 'shaka', age: 100}, {name: 'virgo', age: 18}]

【深入探讨】JavaScript 中的 forEach 和 map 区别,javascript,开发语言,map,forEach
map 处理引用类型数据

 const arr = [{
            name: 'shaka',
            age: 23
        }, {
            name: 'virgo',
            age: 18
        }]
        arr.map(item => {
            if (item.name === 'shaka') {
                item.age = 100
            }
        })
        console.log(arr); //[{name: 'shaka', age: 100}, {name: 'virgo', age: 18}]

【深入探讨】JavaScript 中的 forEach 和 map 区别,javascript,开发语言,map,forEach
发现都改变了原数据

思考:为什么基础数据类型不会更改原数据,引用类型不会

这是因为在使用 forEach 和 map 方法时,对引用类型元素的修改会直接反映在原始数组中。这是因为引用类型的元素实际上存储的是引用(内存地址),而非值本身。因此,通过引用可以访问和修改原始数组中的元素。而number、string、Boolean、null、undefined它们在栈内存中直接存储变量与值。

具体解释如下:
基本数据类型为值传递,callback的执行和原数组毫不相干,所以forEach无法修改基本数据的数组
基本数据类型(Primitive data types)如数值(Number)、字符串(String)、布尔值(Boolean)、null 和 undefined 等,它们在内存中是直接存储变量的值,而不是引用。因此,对于基本数据类型,当它们作为数组的元素被传递给 forEach 或 map 方法时,处理的是它们的值的拷贝,而不是原始值本身。因此,对于基本数据类型,任何更改都只是在处理的拷贝上进行,不会影响到原始数组中的值。


引用类型(Reference types)如对象(Object)、数组(Array)和函数(Function)等,它们在内存中存储的是地址,即指向存储实际数据的内存地址。因此,当引用类型的元素被传递给 forEach 或 map 方法时,处理的是对该地址的引用,而不是原始数据本身。这意味着对引用类型的元素进行的任何更改都会直接反映在原始数组中,因为它们都指向相同的内存地址。

好书推荐

《ReactJS入门实践》
【深入探讨】JavaScript 中的 forEach 和 map 区别,javascript,开发语言,map,forEach
本书涵盖了编写高质量React代码要掌握的一切内容。你将学习使用函数方法和类方法编写React组件;学习如何使用几种不同的方法来管理应用程序的状态,包括使用React Hooks和setState方法;学习如何将组件合在一起来创建完整的动态用户界面;还将学习如何从外部数据源获取数据并在应用程序中使用。此外,本书介绍了如何在用户的Web浏览器中存储数据,以提高应用程序的性能和可用性。谈到可用性,你将会了解在移动设备和桌面上运行应用程序的最佳实践,还将了解如何确保应用程序可访问。

如果你对《ReactJS实践入门》感兴趣的话,可以点击链接购买:链接直达文章来源地址https://www.toymoban.com/news/detail-860693.html

到了这里,关于【深入探讨】JavaScript 中的 forEach 和 map 区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【面试题】详解JavaScript中的Map()

     前端面试题库 ( 面试必备)              推荐:★★★★★ 地址:前端面试题库 JavaScript是一种动态、解释性的编程语言,用于开发web上的动态页面和交互式应用程序。与其他编程语言相比,JavaScript拥有更加灵活的内置数据类型,并且拥有更高级别的调试和错误处理工

    2024年02月11日
    浏览(14)
  • forEach跟Map区别

    forEach 和 map 都是 JavaScript 中数组的常用方法,但它们之间的主要区别在于它们的返回值和用途。 1、forEach:它是一个无返回值的方法,它的作用是遍历数组,对数组的每个元素执行相同的操作。 2、map:它是一个有返回值的方法,它的作用是创建一个新的数组,其元素为原始

    2024年04月11日
    浏览(12)
  • 深入理解JavaScript中的Proxy代理

    JavaScript中的Proxy代理是ES6中引入的一项强大功能,它允许我们拦截、修改和自定义对象的底层操作。通过使用Proxy,我们可以在对象的属性读取、赋值、函数调用等操作之前或之后执行自定义的行为。在本文中,我们将深入探讨Proxy代理的各种用法和功能。 Proxy是JavaScript的一

    2024年02月07日
    浏览(8)
  • JavaScript——forEach()方法

    JavaScript——forEach()方法

      举例说明: !注意:只遍历有值的元素

    2024年02月19日
    浏览(14)
  • JavaScript forEach 方法跳出循环

    这个问题平时工作中基本不会遇到,通常是面试时,有的面试官喜欢问这个,所以有了探讨的意义。 首先我们来看看 for 循环是怎么处理跳出的。 JavaScript中,for循环可以使用 break 和 continue 来跳出: continue:跳出本次循环 break:结束循环 了解了 for 循环跳出之后,forEach 如何

    2024年02月03日
    浏览(8)
  • 高级编程JavaScript中的Map键值对你知道吗?一篇文章看懂

    Map 保存键值对,其中键可以是任何数据类型。 Map 会记住键的原始插入顺序。 Map 提供表示映射大小的属性。 方法 描述 new Map() 创建新的 Map 对象。 set() 为 Map 中的键设置值。 get() 获取 Map 对象中键的值。 clear() 从 Map 中移除所有元素。 delete() 删除由某个键指定的 Map 元素。

    2024年01月25日
    浏览(12)
  • 深入了解JavaScript中的AJAX和HTTP请求

    深入了解JavaScript中的AJAX和HTTP请求

    在现代Web开发中,AJAX(Asynchronous JavaScript and XML)和HTTP请求被广泛应用于实现动态交互式网页。本文将深入探讨AJAX的概念、工作原理以及使用方法。 AJAX是一种利用JavaScript和HTTP请求与服务器进行异步通信的技术。传统的浏览器请求页面会刷新整个页面,而AJAX允许在不刷新页

    2024年02月08日
    浏览(11)
  • 深入解析JavaScript中的var、let和const

    深入解析JavaScript中的var、let和const

    🧑‍🎓 个人主页: 《爱蹦跶的大A阿》 🔥 当前正在更新专栏: 《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​  ​         变量的声明是编程中非常基础和关键的概念。在ES6之前,JavaScript只有var一种声明变量的方式。ES6带来了let和const来声明变量

    2024年01月20日
    浏览(12)
  • typeof 在TypeScript中和JavaScript中的区别

    typeof 在TypeScript中和JavaScript中的区别

            在TypeScript中和JavaScript中都有typeOf,但是作用用法却大有不同。 一、typeof用来判断数据类型返回结果: 基本数据类型:string,number,boolean,undefined 引用数据类型:object (不管是什么引用类型就返回object),function 二、typeof判断变量是否存在         ts中的typeof可

    2024年02月09日
    浏览(10)
  • JS中Array的forEach、map、filter方法区别?

    一:基本用法 1、forEach() 函数用于对数组中的每个元素执行给定的函数,而它不返回任何值,它只是对每个元素调用传入的函数。这个函数可以接受三个参数:当前元素的值、当前元素的索引和整个数组。 2、map() 函数也用于对数组中的每个元素执行给定的函数,但它返回一

    2024年02月05日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包