Приводит ли любое изменение массива к изменению всего массива?

Я задался этим вопросом, подумав об алгоритмах сортировки.

Будет ли изменение позиции элемента внутри массива одинаковым на этапах интерпретации, компиляции или выполнения для воссоздания всего массива с новыми элементами?
Меняется ли он радикально от одного языка к другому?
Как это работает?

Представьте себе конкретный случай в JavaScript, например:

let animals = ["monkey","zebra","banana","capybara"];

animals.splice(2,1); // returns ["banana"]

Правильно ли будет сказать, что весь массив animals был перезаписан? Или есть другой тип типа изменения? Как это единственное изменение будет работать с точки зрения вычислений?

В документации Javascript указано, что метод .splice() «берет» объект массива, создает новый массив без него и возвращает другой с ним в качестве вывода, но как это работает?

Я начинающий, поэтому, пожалуйста, наберитесь терпения и хотел бы получить хорошую рекомендацию по чтению, если это возможно, чтобы узнать об этом больше. Извините за неудобства.

«Это указано в документации по Javascript ...» - на какую документацию вы ссылаетесь? Пожалуйста, дайте ссылку.

Dai 23.04.2022 04:05
itnext.io/…
madprops 23.04.2022 04:52
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
2
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Does changing an element position inside an array would be the same, at the interpretation, compilation or run-time phases, to recreate the entire array with new elements?

Я думаю, вы спрашиваете это:

Does changing an element position inside an array recreate the entire array with new elements?

  • Если вы используете индексатор массива [], то нет: массив не создается заново, это мутировал на месте.
  • Если вы используете Array.prototype.splice, то нет: массив не создается заново, это мутировал на месте.
    • But splicedoes return a new array containing the removed elements.
  • Если вы используете Array.prototype.filter и/или Array.prototype.map, то да: возвращается новый массив, содержащий только отфильтрованные элементы (и исходный входной массив вообще не изменяется: т.е. ничего не мутировало).
  • Если вы используете Array.prototype.forEach для присвоения элементов обратно самому себе (что вы не должны делать в любом случае), то нет: массив изменяется на месте.

Imagining a specific case in JavaScript, for example:

let animals = ["monkey","zebra","banana","capybara"];  
animals.splice(2,1); // returns ["banana"]

Would it be correct to state that the entire animals array was rewritten?

Нет. Это было бы неправильно.

Правильно сказать, что «массив animals был мутирован».

It's stated in Javascript documentation that the .splice() method "takes" an array object, creates a new array without it and returns another one with it as an output, but how does it work?

Я не знаю, о какой «документации JavaScript» вы говорите, но это неверно.

Единственными авторитетными источниками документации по JavaScript являются либо официальная спецификация ECMAScript, либо документация, предоставленная поставщиками движка JavaScript (например, Spidermonkey от Mozilla), задокументированная на MDN.

Такие источники, как W3Schools, не являются авторитетными.

... и MDN говорит о splice (выделено мной):

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

The splice() method changes the contents of an array by removing or replacing existing elements and/or adding new elements in place.


how does it work?

Внутренняя работа функции spliceопределены в спецификации ECMAScript (раздел 23.1.3.29).

...которые можно резюмировать следующим образом:

  1. Учитывая вызов splice с аргументами ( this: Array, start: int, deleteCount: int );...
  2. Создайте новый массив для хранения deleteCount элементов: deletedItems.
  3. Скопируйте элементы в this из индекса start в start + deleteCount в deletedItems.
  4. Скопируйте элементы в this из start + deleteCount в this.lengthснизу вверх, чтобы заполнить пробел удаленных элементов.
  5. Уменьшите length до this.length - deleteCount.

В TypeScript что-то вроде этого (игнорируя обработку отрицательных аргументов):

function splice<T>( this: T[], start: int, deleteCount: int ): T[] {
    
    const removedItems: T[] = [];
    const tailIdx = start + deleteCount;

    for( let i = start; i < tailIdx; i++ ) {
        removedItems.push( this[i] );
    }

    for( let i = tailIdx, f = start; i < this.length; i++, f++ ) {
        this[i] = this[f];
    }

    this.length = this.length - deleteCount;
}

Эй, большое спасибо! В силу своей неопытности, я не смог построить свой вопрос лучше, но это правильно, это то, о чем я спрашивал. Спасибо, что поправили меня и объяснили!

t_carvalho 23.04.2022 17:09

Другие вопросы по теме