开发者社区> 问答> 正文

在javascript中进行foreach时是否可以更改数组的值?

例:

var arr = ["one","two","three"];

arr.forEach(function(part){ part = "four"; return "four"; })

alert(arr); 数组仍保留其原始值,是否可以通过迭代函数对数组元素进行写访问?

展开
收起
保持可爱mmm 2020-01-16 14:23:11 596 0
1 条回答
写回答
取消 提交回答
  • 让我们尝试使其简单并讨论其实际工作方式。它与变量类型和函数参数有关。

    这是我们正在讨论的代码:

    var arr = ["one","two","three"];

    arr.forEach(function(part) { part = "four"; return "four"; })

    alert(arr); 首先,这里是您应该阅读Array.prototype.forEach()的地方:

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

    其次,让我们简要地谈谈JavaScript中的值类型。

    基元(未定义,null,字符串,布尔值,数字)存储实际值。

    例如: var x = 5;

    引用类型(自定义对象)存储对象的内存位置。

    例如: var xObj = { x : 5 };

    第三,函数参数如何工作。

    在函数中,参数始终按值传递。

    因为arr是字符串数组,所以它是原始对象数组,这意味着它们是按值存储的。

    因此,对于上面的代码,这意味着每次forEach()迭代时,part等于的值相同arr[index],但不等于相同的对象。

    part = "four";将更改part变量,但将不理会arr。

    以下代码将更改您想要的值:

    var arr = ["one","two","three"];

    arr.forEach(function(part, index) { arr[index] = "four"; });

    alert(arr); 现在,如果array arr是引用类型的数组,则下面的代码将起作用,因为引用类型存储的是对象而不是实际对象的存储位置。

    var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];

    arr.forEach(function(part, index) { // part and arr[index] point to the same object // so changing the object that part points to changes the object that arr[index] points to

    part.num = "four"; });

    alert(arr[0].num); alert(arr[1].num); alert(arr[2].num); 以下内容说明了您可以更改part为指向一个新对象,而将对象保留为arr单独存储:

    var arr = [{ num : "one" }, { num : "two"}, { num : "three"}];

    arr.forEach(function(part, index) { // the following will not change the object that arr[index] points to because part now points at a new object part = 5; });

    alert(arr[0].num); alert(arr[1].num); alert(arr[2].num);

    问题来源于stack overflow

    2020-01-16 14:23:39
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript函数 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载