Где изменчивость объектов, определенных в ECMAScript?

В этот вопрос о передаче аргументов в функциях JavaScript мы узнаем, что все передается по значению в JavaScript.

В документы Mozilla упоминается, что примитивные типы неизменяемы и объекты. Хотя я пришел из процедурной и структурированной школы программирования, я смог быстро подобрать концепции.

В стандарте ECMAScript определено, что "объект" логически "представляет собой набор свойств". Стандарт также определяет, как можно сравнивать объекты, но не учитывается, что происходит, когда объект проходит через псевдофункцию GetValue(), которая преобразует ссылки в значения.

Итак, я дал ответ в вопросе, в основном говоря, что эта область осталась undefined.

Мой вопрос

Я чувствую, что "left undefined", я имел в виду, это не было философски полностью ясным, какова ценность объекта. Стандарт прошел через несколько ревизий, и его размер постоянно увеличивается.

Короче говоря, объект представляет собой коллекцию, но какова ценность коллекции? Это состав его содержания? Или это индивидуальность? Или я пропускаю некоторые важные тексты?

Ответ 1

В спецификации ECMAScript каждый объект имеет определенные "внутренние методы", некоторые из которых (например, [[DefineOwnProperty]] и [[Put]] могут изменять состояние объекта. В конечном счете, изменчивость объектов определяется с помощью таких внутренних методов.

Ответ 2

GetValue() не исключает, что происходит с объектами - шаг №1:

If Type(V) is not Reference, return V.

Итак, вы передаете ему объект, вы получите тот же объект.

(что опровергает одно из ваших предпосылок, но я не уверен, что он решает ваш вопрос.)

Ответ 3

См. раздел 4.3.26 "Свойство" издания 5.1. В записке говорится:

В зависимости от формы свойства значение может быть представлено либо непосредственно как значение данных (примитивное значение, объект или объект функции), либо косвенно с помощью пары функций доступа.

Мы можем считать, что значение данных является одним из следующих:

  • Примитивное значение: например, C-язык double, _Bool, ((void *) 0) и т.д.
  • Объект: который может быть интерпретирован как специальная структура языка С, содержащая лежащую в основе информацию об объекте.
  • Объект функции: это всего лишь частный случай 2, возможно, результат компиляции JIT.

Причина, по которой эта нота для определения свойства важна, заключается в том, что все - даже области функциональных блоков - это объекты (или, по крайней мере, описываются в терминах одного). Поэтому, если мы сможем определить, что "ценность объекта" - это его индивидуальность, а не ее контент-макияж, то с тем, что каждый объект, доступный из программы JavaScript, получает доступ, как будто это свойство какого-либо другого объекта.


В разделе 4.2 "Обзор языка" говорится:

Примитивное значение является членом одного из следующих встроенных типов: Undefined, Null, Логическое, Число и Строка; объект является членом оставшегося встроенного типа Object; и функция является вызываемым объектом.

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

В качестве интерпретации рассмотрим значение объекта как самого объекта, поскольку мы можем сделать вывод из псевдослучайной функции GetValue(): в обзоре говорится, что "объект является членом объекта... типа", поэтому, это членство в типе объекта.

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

Поэтому мы заключаем, что - значение объекта JavaScript - это его индивидуальность.


Наконец, что касается вопроса, заданного в названии.

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