2015-05-16 3 views
0

У меня есть две функции. Одна из них - нечистая функция, которая просто возвращает результат другого. Меня смущает несоответствие результатов между двумя разными способами его вызова.возвращающий результат одной функции внутри другой дает неверный результат

Функции:

function reverseArray(array) { 
    var newArray = []; 
    for(i = 0; i < array.length; i++) { 
    newArray.unshift(array[i]); 
    } 
    return newArray; 
} 

function reverseArrayInPlace(array) { 
    return reverseArray(array); 
} 

Когда я называю:

console.log(reverseArrayInPlace(["one", "two"])); 

Console показывает, что я ожидаю, что: ["two", "one"]

Но когда я присвоить массив переменной, передать его в качестве аргумента и для входа в консоль, например:

var foo = ["one", "two"]; 
reverseArrayInPlace(foo); 
console.log(foo); 

Я получаю ["one", "two"]

Почему последняя ситуация дает другой результат, чем первый?

+0

Пожалуйста, подтвердите, что «JavaScript» является язык, который вы заинтересованы, как и большинство языков поддерживают функции и массивы и поведение кода зависит от языка, который вы выбрали. –

+0

Да, JavaScript был языком, который меня интересовал @AlexeiLevenkov – sabaeus

ответ

1

Поскольку ваш код является «вызовом по значению».

Когда обратный_ArrayInPlace вызывается с явным параметром foo, копия foo создается для тела функции. Функция не изменяет исходное значение foo.

Для того, чтобы установить Foo для возвращаемого значения функции, вы можете написать

foo = reverseArrayInPlace(foo); 
1

Это так же просто, как вы не меняется состояние в вашей программе, а просто возвращает значение. Так что если вы хотите, чтобы повлиять на изменение обув, вы должны установить его равным результату от reverseArrayInPlace

исправлено:

var foo = ["one", "two"]; 
foo = reverseArrayInPlace(foo); 
console.log(foo); 
1

newArray.unshift(array[i]) Добавляет прошли элементы в передней части массива. Обратите внимание, что список элементов добавляется в целом, так что добавленные элементы остаются в одном порядке. Все цифровые ключи массива будут изменены, чтобы начать отсчет с нуля, пока не будут затронуты литеральные клавиши.

Посмотрите этот пример:

<?php 
$queue = array("orange", "banana"); 
array_unshift($queue, "apple", "raspberry"); 
print_r($queue); 
?> 

Приведенный выше пример выведет:

Array 
(
    [0] => apple 
    [1] => raspberry 
    [2] => orange 
    [3] => banana 
) 

Обратите внимание, что если вы передаете массив ["something","another"], unshift вернуть ["another","something"], но не с переменными.

0

Первый код печатает результат функции, второй код печатает аргумент функции.

Чтобы увидеть, что поведение идентично:

var foo = ["one", "two"]; 
console.log(reverseArrayInPlace(foo)); 

Боковые ноты:

  • обе функции reverseArray/reverseArrayInPlace являются чистыми (не меняя значения/состояния и возвращает тот же результат для той же вход)
  • на основе имени функции похоже, что вы ожидаете изменения foo - для достижения этого вам необходимо изменить массив, переданный как аргумент, а не создать новый.

код, показывающий один способ изменить массив:

function reverseArrayInPlace(array) { 
    var reversed = reverseArray(array); 
    for(var i = 0; i < array.length; i++) 
    { 
    array[i] = reversed[i]; 
    } 
} 

var foo = ["one", "two"]; 
reverseArrayInPlace(foo); 
console.log(foo); // ["two", "one"] 
Смежные вопросы