2016-08-24 3 views
0

Я новичок в JavaScript и чувствую, что мне, должно быть, не хватает чего-то фундаментального здесь!Назначение значения переменной изменяется значение правой стороны

Я создаю функцию, которая сортирует список целых чисел list и возвращает минимальное значение listSort[0].

function sortNumber(a,b) { 
    return a - b; 
} 

var min = function(list){ 
    console.log(list[0]); 
    var listSort = list.sort(sortNumber); 
    console.log(list[0]); 
    console.log(listSort[0]); 
    return list[0]; 
} 

Может кто-нибудь объяснить, почему значение list[0] изменений после list.sort(sortNumber) присваивается listSort?

Спасибо!

+0

[ 'Array.prototype.sort,()'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort): «Метод sort() сортирует элементы массива ** на месте ** и возвращает ar лучей. Сорт не обязательно стабильный. Порядок сортировки по умолчанию соответствует строковым кодам Unicode. « – Andreas

ответ

0

Функция sort() напрямую изменяет массив, к которому применяется. Например:

myArray.sort(); 

напрямую изменяет содержимое myArray. Если вы не хотите, чтобы изменить содержание исходного массива, необходимо использовать функцию клонирования:

function mySortingFunction(list){ 
    var newList = myCloningFunction(list); 
    newList.sort(); 
    return newList; 
} 

Есть несколько способов клонировать массив: Javascript fastest way to duplicate an Array - slice vs for loop

Если вы используете AngularJS вы можете просто написать:

var newList = angular.copy(list); 
0

Чтобы получить минимальное значение массива, лучше использовать Math.min

var list = [4,2,4,2,6,5,2,4,3,5,2]; 

var min = Math.min.apply(null, list); 
0

Если я прав, это потому, что, когда вы используете ваше задание, вы выполняете list.sort (sortNumber) и поэтому изменение списка в соответствии с функцией назначения.

Тааак ... читать как это: - list.sort (sortNumber) => изменение списка - список присваивается listSort

Несмотря на это, я думаю, что вы собираетесь далеко, чтобы найти мин. : P

+0

Отказаться от назначения значения без выполнения сортировки? Или, возможно, мне просто нужно сделать ' listSort = list; listSort.sort (sortNumber); ' of Конечно - я, вероятно, должен в этом примере полностью исключить listSort, но в основном хочу понять, как работает назначение. – Chilliontop

+0

Хм .. Я действительно не знаю, есть ли способ присвоить значение без выполнения сортировки. (За исключением для вашего предложения, вот что я буду делать в этом случае) Один из способов - переписать функцию, которая вернет значение, подобное «sort (list, sortNumber)», где вы можете делать все обработки. – Aks

+0

@Chilliontop 'listSort = list; listSort.sort (sortNumber); 'такой же как' listSort = list.sort (sortNumber) '(относящийся к результат) -> [Примитивное значение vs Исходное значение] (https://stackoverflow.com/questions/13266616/primitive-value-vs-reference-value) – Andreas

Смежные вопросы