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/