Ответ 1
Где спецификация говорит, что значения типа Object ведут себя иначе, чем примитивы? Это только то, что примитивы неизменяемы, а объекты изменяемы?
Да, он в основном сводится к изменчивости объектов, а идентификация объектов. На самом деле, это даже не указано нигде, это просто предполагается как основная идея объектно-ориентированного программирования. Единственное упоминание об этом - комментарий в Приложение E, в котором говорится, что "изменение [значений выражения литерализма регулярного выражения] обнаруживается любым программы, которые проверяют идентичность объекта таких буквенных значений или чувствительны к общим побочным эффектам".
Даже изменчивость объектов в нигде явно не указана, но подразумевается фразами как "В ECMAScript состояние и методы переносятся объектами", "Объект ECMAScript - это совокупность свойств" и "Семинары" понятия "изменяющегося" свойства значения, свойства "создания" или атрибуты свойств "установка" (в методе [[DefineOwnProperty]).
Я спрашиваю, потому что мы всегда говорим о "ссылках на объекты" и "ссылочных значениях" при попытке объяснить поведение объектов, но я не мог найти ничего аналогичного этому в спецификации.
Это потому, что спецификация не является руководством к языку и объяснением ее особенностей, а просто спецификацией ее (внутренних) характеристик. Ожидается, что читатель узнает ООП и его идеи.
Фактически, язык всегда говорит только о значениях - независимо от того, могут ли они быть примитивными значениями или объектами. Единственное, что может быть изменено инструментами языка, это привязка записей среды (переменных) и свойств объектов, все остальное (включая идентификатор объекта) неявно считается неизменным.
Когда мы пытаемся объяснить "поведение объектов", мы в основном объясняем концепцию идентичности объектов. Обычно аудитория поступает с языков более низкого уровня, а не из ООП, где присваивания копируют по умолчанию, а общие значения выполняются указателями (ссылками). Для них мы объясняем объекты как " reference для коллекции свойств", а все видимости объекта - это ссылки, которые указывают на одну и ту же коллекцию. Нет встроенного способа копирования коллекции.
Однако, чтобы подчеркнуть отсутствие ссылок вообще 1 (нельзя ссылаться на привязку идентификатора, то есть переменную - независимо от ее типа значения) и соответствовать официальной фразировке, мы также используем термин значение для всего. Это ввел термин "опорное значение" для объектов.
Кроме того, формулировка в Sameness/Алгоритм равенства (s) соответствует этому: "где x
и y
значения,..., [когда оба имеют тип Object],..., return true
, если x
и y
ссылаются на один и тот же объект."
1. На самом деле спецификация описывает Ссылки как Тип спецификации. Они обозначают свойства объектов и используются для описания поведения delete
, присвоений свойств, вызовов методов и т.д. Однако они не могут быть переданы (назначение, вызов функции), являются внутренними и не получается, и не будет указывать на переменные. Тем не менее, нет встроенного способа получить какой-то указатель на локальную переменную.