Как ИМЕННО работает оператор return

#javascript #return

Вопрос:

Почему это НЕ работает в Javascript:

 function removeSmallest(numbers) {    
var min = Math.min(...numbers);  
return numbers.splice(numbers.indexOf(min), 1);
}
 

но это ДЕЛАЕТ???

 function removeSmallest(numbers) {
  var min = Math.min(...numbers);
  numbers.splice(numbers.indexOf(min), 1); 
  return numbers;
}
 

Я действительно смущен заявлением о возврате, кроме того, что знаю, что оно мне нужно.

Комментарии:

1. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

2. Проблема не return в этом . Проблема splice() в том . Внимательно прочитайте документы и поймите, как splice() это работает

3. Мне кажется, что я использую splice() точно так же, как здесь, поэтому я не вижу разницы

4. О, я вижу, в первом я возвращаю массив сращивания, а не числа

5. Итак, я получаю массив [min] против массива [всего остального], это правильно?

Ответ №1:

Обе написанные вами функции являются допустимыми javascript, и на самом деле есть третий вариант, в котором даже не используется оператор return. Если вы соединяете массив, который вы передали, у вас уже есть результирующий массив. Считать:

 function removeSmallest1(numbers) {    
  var min = Math.min(...numbers);  
  return numbers.splice(numbers.indexOf(min), 1);
}

function removeSmallest2(numbers) {    
  var min = Math.min(...numbers);  
  numbers.splice(numbers.indexOf(min), 1);
  return numbers;
}

function removeSmallest3(numbers) {    
  var min = Math.min(...numbers);  
  numbers.splice(numbers.indexOf(min), 1);
}

let args1 = [1, 3, 5, 7];
let args2 = [1, 3, 5, 7];
let args3 = [1, 3, 5, 7];

console.log("function1 input:", JSON.stringify(args1), "output:", JSON.stringify(removeSmallest1(args1)));
console.log("function2 input:", JSON.stringify(args2), "output:", JSON.stringify(removeSmallest2(args2)));
console.log("function3 input:", JSON.stringify(args3), "output:", JSON.stringify(removeSmallest3(args3)));

console.log("After calling functions, original arrays:");
console.log(JSON.stringify(args1)); // [3, 5, 7]
console.log(JSON.stringify(args2)); // [3, 5, 7]
console.log(JSON.stringify(args3)); // [3, 5, 7] 

Обратите внимание, что в каждом случае исходный массив изменяется путем вызова функции для него. Разница в возвращаемом значении обусловлена тем, как работает сращивание в Javascript. Из документации следует, что возвращаемое значение splice равно:

Массив, содержащий удаленные элементы. Если удаляется только один элемент, возвращается массив из одного элемента. Если элементы не удалены, возвращается пустой массив.

Вызывая return numbers.splice(numbers.indexOf(min), 1) , вы указываете функции, чтобы она возвращала значение, возвращаемое splice .