javascript - Javascript 数组对象的行为

标签 javascript

function map(f, a) {
  for(var i in a) {
    a[i] = f(a[i]);
  }
}

var a = [0, 1, 2, 3];
map(function(x) { return x = x * x }, a);
console.log(a);

a:[0,1,4,9]

但是,如果我将 map(f, a) 更改为:

function map(f, a) {
  for(var i in a) {
    f(a[i]);
  }
}
var a = [0, 1, 2, 3];
map(function(x) { return x = x * x }, a);
console.log(a);

a 保持不变,为:[0, 1, 2, 3]

我不确定这里发生了什么。看起来好像解释器将 a[i] 视为对 map(f, a) 中对象 a 的属性的引用,但是一旦传递到f,它就会变成typeof number

最佳答案

不要在数组上使用for(... in...)。使用for循环

for in 的枚举顺序得到保证。它还会迭代属性(不是内置的,而是由 JS 代码设置的东西)和原型(prototype)上的东西,然后一切都会崩溃。

接下来,除了数组和对象之外的所有值都是按值传递(基本上数组和对象也是按值传递,但值是指向对象的指针)。

因此,在这种情况下,您不会修改数组内的值,而是修改局部变量x,它们恰好具有相同的值。

return x = x * x 赋值是多余的。

修复版本

function map(f, a) {
  for(var i = 0, l = a.length; i < l; i++) {
    a[i] = f(a[i]);
  }
}

var a = [0, 1, 2, 3];
map(function(x) { return x * x }, a);
console.log(a);

关于javascript - Javascript 数组对象的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4359596/

相关文章:

javascript - 修改字典数组,在每个字典中添加一个元素

javascript - 清除 Bootstrap 中的表单输入字段?

javascript - 使用 JavaScript 和 HTML 动态附加行

JavaScript 输入意外结束并带有中断

javascript - Nodejs,Express GET POST 参数

javascript - 从数组的数组中的对象获取值

javascript - 传单 map 无法识别图层

javascript - 在新窗口中打开以添加打印页面功能

javascript - 获得最高数组值的其他方法

javascript - 在 rxjs 中的订阅函数 block 中处理/取消订阅