为什么函数不改变数组?

时间:2018-02-12 07:46:10

标签: javascript arrays operations

请考虑以下JavaScript代码:

function myArr(arr){
    arr = arr + arr;
    return arr;
}

var arr = new Array(1,3,2,5);
myArr(arr);
document.write(arr); // Output : 1,3,2,5
arr = arr + arr;
document.write(arr); // Output : 1,3,2,51,2,5

为什么函数myArr()在函数内外执行相同的操作时返回相同的数组?为什么这里有两个不同的行为显示相同的操作语句?

5 个答案:

答案 0 :(得分:0)

因为您没有将myArr()方法返回的值赋给变量。它应该是arr = myArr(arr);而不是myArr(arr);尝试跟随,

function myArr(arr){
    arr = arr+arr;
    return arr;
}
var arr = new Array(1,3,2,5);
arr = myArr(arr);
document.write(arr);// It should give Output : 1,3,2,5,1,3,2,5

var arr = new Array(1,3,2,5);
arr = arr+arr;
document.write(arr);// Output : 1,3,2,5,1,3,2,5

答案 1 :(得分:0)

您的函数返回已修改的数组。你调用函数myArr(arr)但没有存储函数返回的结果。它应该像

    function myArr(arr){
    arr = arr+arr;
    return arr;
}
var arr = new Array(1,3,2,5);
arr=myArr(arr);

答案 2 :(得分:0)

javascript中没有pass-by-reference

在函数myArr中,arr具有嵌套范围,因此它从未从全局范围中获取arr值。

function myArr(arr){
    arr = arr+arr; // creates new arr at a different location
    return arr;
}
var arr = new Array(1,3,2,5);
arr = myArr(arr);
document.write(arr);

答案 3 :(得分:0)

function myArr(arr){
    console.log(typeof(arr)); // pass as a Object
    arr = arr+arr;            // + operator do concatination string
    console.log(typeof(arr)); // now converted in String
    return arr;
}
var arr = new Array(1,3,2,5);
myArr(arr);
document.write("Output 1="+arr+"<br/>");// Output : 1,3,2,5

arr = arr+arr;  // + operator do concatination string

// 1,3,2,5 + 1,3,2,5  ==> type String( 1,3,2,51,3,2,5 )

document.write("Output 2="+arr);// Output : 1,3,2,51,3,2,5

答案 4 :(得分:0)

下面的代码与您提供的代码相同,但更容易理解:

    function myArr(array){
        array = array + array;
        return array;
    }

    var arr = new Array(1,3,2,5);
    myArr(arr);
    document.write(arr); // Output : 1,3,2,5
    arr = arr + arr;
    document.write(arr); // Output : 1,3,2,51,2,5

注意!!! arr是全局变量,而array是部分变量。

如果您将array中的myArr更改为arr,则无关紧要。

Ppartial变量仅在函数运行时才存在,闭包除外。

解释在评论中:

    var arr = new Array(1,3,2,5);//arr=[1,3,2,5];

    myArr(arr);
    function myArr(array){//array=[1,3,2,5],array===arr;
        array = array + array;//array=1,3,2,51,3,2,5;arr didn't change!!!
        return array;//return 1,3,2,51,3,2,5;arr still didn't change!!!
    }

    document.write(arr);//arr=[1,3,2,5],so you see 1,3,2,5

    arr = arr + arr;//arr=1,3,2,51,3,2,5

    document.write(arr);//so you see 1,3,2,51,3,2,51,3,2,5 because it didn't erase the last content.In this case,document write 1,3,2,51,3,2,5 after 1,3,2,5