Nano Hash - криптовалюты, майнинг, программирование

Почему некоторые методы изменяют вызывающий объект на месте, а другие возвращают значение, которое нужно присвоить?

Например, в JavaScript, если вы вызываете Array.sort, он сортирует массив на месте:

var myArray = ['c','b','a'];
myArray.sort(); // Now the array is sorted

Почему вместо этого была выбрана сортировка по месту:

// myArray is preserved, the sortedArray is a sorted copy of myArray
var sortedArray = myArray.sort();

Существуют ли рекомендации, когда следует изменять объект на месте?

09.07.2014

  • См. документацию. 09.07.2014
  • Вы можете попробовать клонировать массив myArray.slice(0).sort() 09.07.2014
  • @SLaks Я прочитал эту страницу и не смог найти никакой теории или причин developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ 09.07.2014
  • @Kirk: Посмотрите на первое предложение. sorts elements of an array in place and returns the array 09.07.2014
  • @SLaks прочитал заголовок к моему вопросу - я хочу знать, почему они выбрали именно этот путь 09.07.2014
  • Потому что так написано в спецификации. (не думайте, что есть разумная причина) 09.07.2014
  • Хорошо, я ищу разумные причины того, почему язык будет разработан так или иначе, я просто использовал JavaScript в качестве примера. Мой вопрос касается теории и плюсов и минусов различных подходов. 09.07.2014
  • Возможно, вы захотите взглянуть на методы нормализации массива и возвращаемые значения 09.07.2014
  • Если вы хотите узнать, почему люди, работающие над спецификацией, решили использовать метод сортировки на месте, спросите на esdiscuss.org. 09.07.2014

Ответы:


1

Все в руках застройщика. Это зависит от того, как вы моделируете поведение объекта.

Всякий раз, когда вы вызываете функцию из объекта, вы словно просите объект что-то сделать.

Если метод сортировки сортирует элементы внутри самого объекта, то метод сортировки предназначен для изменения состояния объекта. Это как просить объект отсортировать себя.

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

По моему личному мнению, вторая функция case должна называться returnSortedArray или что-то в этом роде. Функция sort больше относится к самой сортировке объектов.

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

Если вам по какой-то причине требуется сохранить исходный порядок данных, то лучше будет вернуть отсортированный массив, а не сортировать сам объект.

09.07.2014

2

сортировать на месте — назовем его клон sort1 и сортировать — назовем его sort2

С sort1, если вы хотите, чтобы новый экземпляр отсортированного массива сохранял исходный, клонируйте и сортируйте. Если вы хотите сортировать на месте, просто сортируйте.

С sort2, если вы хотите, чтобы новый экземпляр отсортированного массива сохранял исходный, просто отсортируйте. Если вы хотите сортировать на месте, вы не можете.

Практика для sort1? Я разрабатываю игру. Для каждого обновления кадра я должен сортировать все видимые объекты в z-порядке, и сортировка на месте намного эффективнее.

09.07.2014

3

В JavaScript объекты и другие сложные типы данных всегда изменяются на месте. Этому есть несколько причин, но в первую очередь это функция эффективности. Если вы хотите сделать копию массива, объекта и т. д., вам нужно явно клонировать экземпляр. Было бы плохой практикой делать это без необходимости, поэтому делайте это только при необходимости.

Некоторые функции, такие как concat, на первый взгляд ведут себя иначе, но в случае с concat функция предназначена для использования существующих экземпляров массива и создания нового экземпляра, а не для изменения существующего. Можно сказать, что логически эти функции должны быть свойством глобальных объектов Object или Array, но таким образом реализуются только более новые функции JS, такие как Object.keys.

09.07.2014
  • Неправильный; посмотрите на такие методы, как concat() или filter(). 09.07.2014
  • @SLaks Правда, я добавлю об этом примечание, хотя эти функции предназначены для создания экземпляра новой переменной, а не для изменения ее на месте. 09.07.2014
  • Тогда как насчет String.prototype.replace()? Конечно, он мог бы сделать это и на месте :) 09.07.2014
  • @Jack: строки неизменяемы. Это не может быть сделано на месте. 09.07.2014
  • @Jack: String - это примитив, а не объект. Интересно, что даже явное объявление строки как объекта не позволяет этого сделать. var s = new String("abc");s.replace("b", "z");console.log(s); 09.07.2014
  • @ Александр О'Мара: Да; он наследует тот же прототип. 09.07.2014
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..