调用JavaScript函数会改变参数的值。为什么?

时间:2014-10-05 17:55:18

标签: javascript

我在使用JavaScript方面遇到了一些麻烦。当我在' LINE 2'中调用函数compare时在它下面改变了to_sort [i]的值,但没有改变枢轴。在' LINE 1'打印的值不同于' LINE 3'。这是为什么?

我认为这可能与pivot和to_sort [i]通过引用传递有关,但显然原始类型是通过JavaScript中的值传递的。

帮助表示感谢。

function compare(str1, str2){
    for (i = 0;i < Math.min(str1.length,str2.length); ++i){
        if(str2[i] < str1[i]){
            return false;
        }
    }
    if(str1.length != str2.length && str2.length < str1.length){
        return false;   
    }
    return true;

}

function quicksort(to_sort){
    if(to_sort.length < 2) return to_sort;
    var pivot = to_sort[0];
    var less_pivot = [];
    var more_pivot = [];
    for(i = 1; i < to_sort.length; ++i){
        console.log(to_sort[i]);// LINE 1
        if(compare(to_sort[i], pivot)){//LINE 2
            console.log(to_sort[i]); //LINE 3
            less_pivot = less_pivot.concat(to_sort[i]);
        }
        else{
            more_pivot = more_pivot.concat(to_sort[i]);
        }
    }
    return [].concat(quicksort(less_pivot, compare_function), pivot, quicksort(more_pivot, compare_function));
}
quicksort(["2.0.1", "2.0.0"]);

output:
2.0.0
undefined

1 个答案:

答案 0 :(得分:6)

看起来好像是因为compare函数更改了迭代索引i的值:

for (i = 0; i < Math.min(str1.length, str2.length); ++i) {
    if (str2[i] < str1[i]) {
        return false;
    }
}

因为您声明i没有var关键字。请记住,将未声明的变量赋值为全局变量。