例:
var arr = ["one","two","three"];
arr.forEach(function(part){ part = "four"; return "four"; })
alert(arr); 数组仍保留其原始值,是否可以通过迭代函数对数组元素进行写访问?
让我们尝试使其简单并讨论其实际工作方式。它与变量类型和函数参数有关。
这是我们正在讨论的代码:
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。