Javascript 为什么第一个console.log()打印未定义的值,而第二个打印已转换的值

Javascript 为什么第一个console.log()打印未定义的值,而第二个打印已转换的值,javascript,Javascript,为什么第一个console.log()打印未定义的值,而第二个打印已转换的值?我知道它必须与函数作用域有关,但不能得到它 var数组=[1,2,3,4,5,7]; 函数递增1(arr){ arr=arr.map(函数(值、索引、数组){ arr[index]=arr[index]+1; }); 控制台日志(arr); } 递增1(数组); console.log(数组); //[未定义,未定义,未定义,未定义,未定义,未定义] //[2,3,4,5,6,8]您需要从映射内的函数返回递增的值。使

为什么第一个console.log()打印未定义的值,而第二个打印已转换的值?我知道它必须与函数作用域有关,但不能得到它

var数组=[1,2,3,4,5,7];
函数递增1(arr){
arr=arr.map(函数(值、索引、数组){
arr[index]=arr[index]+1;
});
控制台日志(arr);
}
递增1(数组);
console.log(数组);
//[未定义,未定义,未定义,未定义,未定义,未定义]

//[2,3,4,5,6,8]
您需要从映射内的函数返回递增的值。使用
返回arr[index]+1
您还需要返回使用map形成并存储在arr中的新数组

var数组=[1,2,3,4,5,7];
函数incrementByOne(arr){//包含数组引用
arr=arr.map(函数(值、索引、数组){
返回值+1;
});
//现在,arr包含一个新数组,不再引用传递的数组。
控制台日志(arr);
返回arr;
}
数组=递增1(数组);
console.log(数组);
//[未定义,未定义,未定义,未定义,未定义,未定义]

//[2,3,4,5,6,8]
这里发生了几件事:

  • 传递到.map函数的回调应该返回一个带有return关键字的值。如果不从回调返回值,则默认返回值未定义。这就是为什么在incrementByOne中定义的“arr”数组在您使用第一个console.log记录它时,其中只有未定义的值。我认为您真正想要做的只是在回调函数中返回值+1

  • 您在这里生成了一个经典的通过引用传递的值传递错误;每个人在第一次学习JS时都会犯这样的错误。我建议你看看像这样的帖子。简而言之,在.map回调中,您正在将传递到incrementByOne的数组进行变异,该数组与您使用第二个console.log注销的数组相同;这就是为什么这些值似乎正确递增的原因

  • var数组=[1,2,3,4,5,7];
    函数递增1(arr){
    arr=arr.map(v=>v+1);
    控制台日志(arr);
    }
    递增1(数组);
    console.log(数组);
    //[未定义,未定义,未定义,未定义,未定义,未定义]
    
    //[2,3,4,5,6,8]
    以上所有答案都是正确的,但它们忽略了这里最重要的一点。JavaScript中有一个称为“通过共享调用”的概念

    考虑以下代码:

    var num=3;
    var json={myValue:'10'};
    var json2={myValue:'100'};
    函数调用共享(a、b、c){
    a=a+37;
    b={myValue:'新值'};
    c、 myValue='新值';
    }
    callBySharing(num、json、json2);
    console.log(num)//3*不变*
    log(json.myValue)//10*不变*
    
    console.log(json2.myValue);/'新值“*已更改*
    是的,但这并不能回答有关范围的问题。。。您不希望输出在应用映射的函数范围内外保持一致吗?好的,实际上现在第二个console.log没有转换的值,我所做的工作是:返回arr[index]=arr[index]+1;因为incrementByOne(arr)需要
    返回(arr)
    ,当您调用它时,您需要将结果分配给数组,
    数组=incrementByOne(数组)
    返回arr[index]+1
    -真正的程序员将
    返回值+1
    :p