Подтвердить что ты не робот

Как объяснить ссылки на объекты в терминах ECMAScript?

Рассмотрим это:

var a = {}, b = a;

В терминах spec, b = a сводится к PutValue(b, GetValue(a)), правильно? И GetValue(a) использует абстрактную операцию GetBindingValue("a", strictFlag), которая возвращает "значение" в a. И "значение" - это "объект" , первоначально назначенный на a. Затем "объект" хранится в b, как и любое другое значение.

Но что такое "объект" именно? Где спецификация говорит, что значения типа объекта ведут себя иначе, чем примитивы? Это только то, что примитивы неизменяемы, а объекты изменяемы?

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

4b9b3361

Ответ 1

Где спецификация говорит, что значения типа Object ведут себя иначе, чем примитивы? Это только то, что примитивы неизменяемы, а объекты изменяемы?

Да, он в основном сводится к изменчивости объектов, а идентификация объектов. На самом деле, это даже не указано нигде, это просто предполагается как основная идея объектно-ориентированного программирования. Единственное упоминание об этом - комментарий в Приложение E, в котором говорится, что "изменение [значений выражения литерализма регулярного выражения] обнаруживается любым программы, которые проверяют идентичность объекта таких буквенных значений или чувствительны к общим побочным эффектам".

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

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

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

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

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

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

Кроме того, формулировка в Sameness/Алгоритм равенства (s) соответствует этому: "где x и y значения,..., [когда оба имеют тип Object],..., return true, если x и y ссылаются на один и тот же объект."


1. На самом деле спецификация описывает Ссылки как Тип спецификации. Они обозначают свойства объектов и используются для описания поведения delete, присвоений свойств, вызовов методов и т.д. Однако они не могут быть переданы (назначение, вызов функции), являются внутренними и не получается, и не будет указывать на переменные. Тем не менее, нет встроенного способа получить какой-то указатель на локальную переменную.