Где изменчивость объектов, определенных в ECMAScript?
В этом вопросе о передаче аргументов в функциях JavaScript мы узнаем, что все передается по значению в JavaScript.
В документах Mozilla упоминается, что примитивные типы являются неизменяемыми, а объекты - неизменными. Хотя я пришел из школы процедурного и структурированного программирования, я смог быстро подобрать концепции.
В стандарте ECMAScript определено, что "Объект" логически "представляет собой набор свойств". Стандарт также определяет, как объекты могут сравниваться, но не учитывается, что происходит, когда объект проходит через псевдофункцию GetValue(), которая преобразует ссылки в значения.
Итак, я дал ответ на вопрос, в основном говоря, что эта область осталась неопределенной.
Мой вопрос
Я чувствую, что под словом "оставленный неопределенным" я имел в виду, что не было философски полностью ясно, какова ценность Объекта. Стандарт прошел несколько пересмотров, и его размер постоянно увеличивается.
Короче говоря, объект является коллекцией, но какова ценность коллекции? Это состав ее содержания? Или это индивидуальность? Или я упустил некоторые важные тексты?
3 ответа
В спецификации ECMAScript каждый объект определен с определенными "внутренними методами", некоторые из которых (например, [[DefineOwnProperty]] и [[Put]]) могут изменять состояние объекта. В конечном итоге изменчивость объектов определяется с помощью таких внутренних методов.
GetValue() не пропускает то, что происходит с объектами - шаг #1:
If Type(V) is not Reference, return V.
Таким образом, если вы передадите ему объект, вы получите тот же объект.
(Это опровергает одно из ваших предположений, но я не уверен, что оно решит ваш вопрос.)
См. Раздел 4.3.26 "свойство" издания 5.1. В записке говорится:
В зависимости от формы свойства значение может быть представлено либо непосредственно как значение данных (примитивное значение, объект или объект функции), либо косвенно парой функций доступа.
Мы можем принять это как значение данных одним из следующих:
- Примитивное значение: например, язык C double, _Bool, ((void*)0) и т. Д.
- Объект: который можно интерпретировать как специальную структуру языка Си, содержащую основную информацию об объекте.
- Объект функции: это особый случай 2, возможно, результат компиляции JIT.
Причина, по которой это примечание для определения свойства важно, заключается в том, что все - даже области функциональных блоков - являются объектами (или, по крайней мере, описаны в терминах одного). Следовательно, если мы сможем определить, что "значение объекта" является его индивидуальностью, а не составом контента, то с тем фактом, что доступ к каждому объекту, доступному из программы JavaScript, осуществляется так, как если бы он являлся свойством какого-либо другого объекта.
В разделе 4.2 "Обзор языка" говорится:
Примитивное значение является членом одного из следующих встроенных типов: Undefined, Null, Boolean, Number и String; объект является членом оставшегося встроенного типа Object; и функция является вызываемым объектом.
Хотя это неформальный раздел, можно заметить, что объект существенно отличается от примитивного значения.
В качестве интерпретации давайте рассмотрим значение объекта как самого объекта, так как мы можем сделать вывод из псевдо-функции "GetValue()" - в обзоре говорится, что "объект является членом объекта типа... - следовательно, значение является принадлежностью к типу Object.
Чтобы использовать физическую аналогию для объяснения связи между членством и индивидуальностью, мы видим также электроны. Они идентичны по содержанию, они оба являются членами Вселенной, но они два разных человека.
Поэтому мы делаем вывод, что ценность JavaScript-объекта - это его индивидуальность.
Наконец, вопрос, заданный в заголовке.
Изменяемость отдельных объектов определяется в терминах ряда специфических псевдофункций, а неизменность других типов определяется с использованием определения значения-типа типов и спецификации псевдофункций, работающих на значениях примитивного типа.