JavaScript 中的属性也是内部对象吗?
Are properties in JavaScript internally objects as well?
长期以来,我一直在使用 JavaScript 并且对对象和属性的概念有很好的理解。
但是我一直没有想到一件事,直到最近,因为JavaScript中的所有属性都具有[[Configurable]]
等内部属性,所以内部不就是这样吗? , 所有属性本身都是对象?
我查看了 ECMAScript 规范,但似乎没有明确提及这个想法。
如 Mozilla 文档中所定义:JavaScript 中的 属性 由字符串值名称或符号和 属性 描述符组成。
所以,为了回答你的问题,属性 可以由一个符号(原始)和 属性 描述符(一个对象)组成。
规格states:
A named data property associates a name with an ECMAScript language value and a set of Boolean attributes.
... 不使用 PropertyDescriptor:
The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.6.1. In addition, any field may be present or absent.
因此,虽然 PropertyDescriptors 是 记录 ,但对象的属性不是。引擎必须有某种机制来存储对象的属性和值。它是如何做到的是特定于实现的。在列表中存储值和属性的记录是一种可能的实现。
实际上,引擎使用 hidden classes 的概念,即它们创建一个包含元数据的结构,例如 属性 名称及其所有具有相同形状的对象的描述符,表示对象的结构仅存储对隐藏 class 的引用和对象所持有的值。因为这些属性并没有真正存储为“对象”。
This blog 展示了隐藏 classes 在 V8 中的工作方式,这是众所周知的实现之一。
长期以来,我一直在使用 JavaScript 并且对对象和属性的概念有很好的理解。
但是我一直没有想到一件事,直到最近,因为JavaScript中的所有属性都具有[[Configurable]]
等内部属性,所以内部不就是这样吗? , 所有属性本身都是对象?
我查看了 ECMAScript 规范,但似乎没有明确提及这个想法。
如 Mozilla 文档中所定义:JavaScript 中的 属性 由字符串值名称或符号和 属性 描述符组成。
所以,为了回答你的问题,属性 可以由一个符号(原始)和 属性 描述符(一个对象)组成。
规格states:
A named data property associates a name with an ECMAScript language value and a set of Boolean attributes.
... 不使用 PropertyDescriptor:
The Property Descriptor type is used to explain the manipulation and reification of named property attributes. Values of the Property Descriptor type are records composed of named fields where each field’s name is an attribute name and its value is a corresponding attribute value as specified in 8.6.1. In addition, any field may be present or absent.
因此,虽然 PropertyDescriptors 是 记录 ,但对象的属性不是。引擎必须有某种机制来存储对象的属性和值。它是如何做到的是特定于实现的。在列表中存储值和属性的记录是一种可能的实现。
实际上,引擎使用 hidden classes 的概念,即它们创建一个包含元数据的结构,例如 属性 名称及其所有具有相同形状的对象的描述符,表示对象的结构仅存储对隐藏 class 的引用和对象所持有的值。因为这些属性并没有真正存储为“对象”。
This blog 展示了隐藏 classes 在 V8 中的工作方式,这是众所周知的实现之一。