Что значит v в свойствах
Вернуть obj.
8.10.5 ToPropertyDescriptor(Obj) # Ⓣ Ⓔ ① Ⓐ
При вызове абстрактной операции ToPropertyDescriptor В дескриптор свойства с объектом Desc выполняются следующие шаги:
Если Type(Obj) – не Object, сгенерировать исключение TypeError.
Пусть desc будет результатом создания нового Property Descriptor, который вначале не имеет полей.
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " enumerable " – true, то
Пусть enum будет результатом вызова внутреннего метода [[Get]] объекта Obj с аргументом " enumerable ".
Полю [[Enumerable]] дексриптора desc присвоить ToBoolean(enum).
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " configurable " – true, то
Пусть conf будет результатом вызова внутреннего метода Obj [[Get]] с аргументом configurable ".
Полю [[Configurable]] дескриптора desc присвоить ToBoolean(conf).
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " value " – true, то
Пусть value будет результатом вызова внутреннего метода [[Get]] объекта Obj с аргументом value ".
Полю [[Value]] дескриптора desc присвоить value.
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " writable " – true, то
Пусть writable будет результатом вызова внутреннего метода [[Get]] объекта Obj с аргументом writable ".
Полю [[Writable]] дескриптора desc присвоить ToBoolean(writable).
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " get " – true, то
Пусть getter будет результатом вызова внутреннего метода [[Get]] объекта Obj с аргументом " get ".
Если IsCallable(getter) – false, и getter не является undefined, то сгенерировать исключение TypeError exception
Полю desc [[Get]] присвоить getter .
Если результат вызова внутреннего метода [[HasProperty]] объекта Obj с аргументом " set " – true, то
Пусть setter будет результатом вызова внутреннего метода [[Get]] объекта Obj с аргументом " set ".
Если IsCallable( setter ) – false, и setter не является undefined, то сгенерировать исключение TypeError .
Полю desc [[Set]] присвоить setter.
Если присутствует либо desc.[[Get]], либо desc.[[Set]], то
Если присутствует либо desc.[[Value]], либо desc.[[Writable]], то сгенерировать исключение TypeError.
Вернуть desc.
8.11 Типы спецификации Lexical Environment и Environment Record # Ⓣ Ⓔ ① Ⓐ
Типы Lexical Environment Лексическое окружение и Environment Record Запись окружения используются для объяснения поведения разрешения имён во вложенных функциях и блоках. Эти типы и операции с ними описаны в Главе 10.
8.12 Алгоритмы для внутренних методов объектов # Ⓣ Ⓔ ① Ⓐ
В приведенных далее описаниях алгоритмов предположим, что O – родной объект ECMAScript, P – строка, Desc – запись Property Description, а Throw – булев флаг.
8.12.1 [[GetOwnProperty]](P) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[GetOwnProperty]] объекта O с именем свойства P выполняются следующие шаги:
Если у O нет собственного свойства с именем P, вернуть undefined.
Пусть D будет вновь созданным Property Descriptor без полей.
Пусть X будет собственным свойством объекта O с именем P.
Если X – свойство данных, то
Присвоить D.[[Value]] значение атрибута [[Value]] свойства X .
Присвоить D.[[Writable]] значение атрибута [[Writable]] свойства X.
Если X – свойство-аксессор, то
Присвоить D.[[Get]] значение атрибута [[Get]] свойства X .
Присвоить D.[[Set]] значение атрибута [[Set]] свойства X .
Присвоить D.[[Enumerable]] значение атрибута [[Enumerable]] свойства X .
Присвоить D.[[Configurable]] значение атрибута [[Configurable]] свойства X .
Вернуть D.
Если же O – объект String, он имеет более сложный внутренний метод [[GetOwnProperty]], описанный в пункте 15.5.5.2.
8.12.2 [[GetProperty]](P) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[GetProperty]] объекта O с именем свойства P выполняются следующие шаги:
Пусть prop будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с именем свойства P.
Если prop – не undefined, вернуть prop.
Пусть proto будет значением внутреннего свойства [[Prototype]] объекта O.
Если proto – null, вернуть undefined.
Вернуть результат вызова внутреннего метода [[GetProperty]] объекта proto с аргументом P.
8.12.3 [[Get]](P) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[Get]] объекта O с именем свойства P выполняются следующие шаги:
Пусть desc будет результатом вызова внутреннего метода [[GetProperty]] объекта O с именем свойства P.
Если desc – undefined, вернуть undefined.
Если IsDataDescriptor(desc) – true, вернуть desc.[[Value]].
В противном случае IsAccessorDescriptor(desc) должен быть true , поэтому пусть getter будет desc.[[Get]].
Если getter – undefined, вернуть undefined.
Вернуть результат, вызывая внутренний метод [[Call]] для getter , передавая O в качестве значения this, и не передавая никаких аргументов.
8.12.4 [[CanPut]](P) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[CanPut]] объекта O с именем свойства P выполняются следующие шаги:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если desc – не undefined, то
Если desc.[[Set]] – undefined, то вернуть false.
Иначе вернуть true .
Иначе, desc должен быть Дескриптором данных, поэтому вернуть значение desc.[[Writable]].
Пусть proto будет внутренним свойством [[Prototype]] объекта O.
Если proto – null, то вернуть значение внутреннего свойства [[Extensible]] объекта O.
Пусть inherited будет результатом вызова внутреннего метода [[GetProperty]] объекта proto с именем свойства P.
Если inherited – undefined, то вернуть значение внутреннего свойства [[Extensible]] объекта O.
Если IsAccessorDescriptor( inherited ) true, то
Если inherited.[[Set]] – undefined, то вернуть false.
Иначе вернуть true .
Иначе inherited должен быть ДескприпторомДанных.
Если внутреннее свойство [[Extensible]] объекта O – false, вернуть false.
Иначе вернуть значение inherited.[[Writable]].
Объекты среды могут определять дополнительные ограничения для операций [[Put]]. По возможности, объекты среды не должны допускать операций [[Put]] в тех ситуациях, когда это определение внутреннего метода [[CanPut]] возвращает false.
8.12.5 [[Put]](P, V, Throw) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[Put]] объекта O с именем свойства P, значением V и булевым флагом Throw выполняются следующие шаги:
Если результат вызова внутреннего метода [[CanPut]] объекта O с аргументом P – false, то
Если Throw – true, то сгенерировать исключение TypeError.
Иначе вернуть результат.
Пусть ownDesc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом P.
Если IsDataDescriptor( ownDesc ) true, то
Вызвать внутренний метод [[DefineOwnProperty]] объекта O, передавая в качестве аргументов P, valueDesc и Throw .
Пусть desc будет результатом вызова внутреннего метода [[GetProperty]] объекта O с аргументом P. Это может быть либо собственный или наследуемый дескриптор свойства-аксессора, либо наследуемый дескриптор свойства данных.
Пусть setter будет desc.[[Set]], который не может быть undefined.
Вызвать внутренний метод [[Call]] для setter , передавая O в качестве значения this, и передавая V в качестве единственного аргумента.
Иначе, создать именованное свойство данных P объекта O следующим образом:
Вызвать внутренний метод [[DefineOwnProperty]] объекта O, передавая в качестве аргументов P, newDesc и Throw .
8.12.6 [[HasProperty]](P) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[HasProperty]] объекта O с именем свойства P выполняются следующие шаги:
Пусть desc будет результатом вызова внутреннего метода [[GetProperty]] объекта O с именем свойства P.
Если desc undefined, вернуть false.
Иначе вернуть true .
8.12.7 [[Delete]](P, Throw) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[Put]] объекта O с именем свойства P и булевым флагом Throw выполняются следующие шаги:
Пусть desc будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с именем свойства P.
Если desc – undefined, вернуть true.
Если desc.[[Configurable]] – true, то
Убрать из объекта О собственное свойство с именем P.
Вернуть true.
Иначе, если Throw, то сгенерировать исключение TypeError.
Вернуть false.
8.12.8 [[DefaultValue]](подсказка) # Ⓣ Ⓔ ① Ⓐ
При вызове внутреннего метода [[DefaultValue]] объекта O с подсказкой String выполняются следующие шаги:
Пусть toString будет результатом вызова внутреннего метода [[Get]] объекта O с аргументом toString ".
Если IsCallable( toString ) true, то
Пусть str будет результатом вызова внутреннего метода [[Call]] метода toString, с объектомO в качестве значения this и с пустым списком аргументов.
Если str – примитивное значение, вернуть str.
Пусть valueOf будет результатом вызова внутреннего метода [[Get]] объекта O с аргументом valueOf ".
Если IsCallable( valueOf ) true, то
Пусть val будет результатом вызова внутреннего метода [[Call]] метода valueOf, с O в качестве значения this и с пустым списком аргументов.
Если val – примитивное значение, вернуть val.
Сгенерировать исключение TypeError.
При вызове внутреннего метода [[DefaultValue]] объекта O с подсказкой Number выполняются следующие шаги:
Пусть valueOf будет результатом вызова внутреннего метода [[Get]] объекта O с аргументом valueOf ".
Если IsCallable( valueOf ) true, то
Пусть val будет результатом вызова внутреннего метода [[Call]] метода valueOf, с O в качестве значения this и с пустым списком аргументов.
Если val – примитивное значение, вернуть val.
Пусть toString будет результатом вызова внутреннего метода [[Get]] объекта O с аргументом toString ".
Если IsCallable( toString ) true, то
Пусть str будет результатом вызова внутреннего метода [[Call]] метода toString, с объектом O в качестве значения this и с пустым списком аргументов.
Если str – примитивное значение, вернуть str.
Сгенерировать исключение TypeError.
Если внутренний метод [[DefaultValue]] объекта O вызывается без подсказки, он ведет себя так, как если бы подсказка была Number, кроме случаев, когда O – объект Date (см. 15.9.6), и в этой ситуации он ведет себя, как если бы подсказка была String.
Приведенная выше спецификация [[DefaultValue]] для родных объектов может возвращать только примитивные значения. Если родной объект выполняет собственный внутренний метод [[DefaultValue]], он должен убедиться, что его внутренний метод [[DefaultValue]] может возвращать только примитивные значения.
8.12.9 [[DefineOwnProperty]](P, Desc, Throw) # Ⓣ Ⓔ ① Ⓐ
В приведенном ниже алгоритме термин (ориг. "Reject" – прим. перев.) означает “Если Throw – true, то сгенерировать исключение TypeError, иначе вернуть false”. Этот алгоритм содержит шаги, проверяющие различны поля Desc Property Descriptor на наличие определенных значений. Проверяемые таким образом поля не обязательно должны существовать в Desc. Если поле отсутствует, его значение считается false.
При вызове внутреннего метода [[DefineOwnProperty]] объекта O с именем свойства P, дескриптором свойства Desc и булевым флагом Throw выполняются следующие шаги:
Пусть current будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с именем свойства P.
Пусть extensible будет значением внутреннего свойства [[Extensible]] объекта O.
Если current – undefined, а extensible – false, то Отказать.
Если current – undefined, а extensible – true, то
Создать собственное свойство данных с именем P объекта O, у которых значения атрибутов [[Value]], [[Writable]], [[Enumerable]] и [[Configurable]] описывает дескриптор Desc. Если значение поля атрибута Desc отсутствует, атрибуту только что созданного свойства присваивается его значение по умолчанию.
Иначе Desc должен быть Дескриптором свойств-аксессоров, поэтому
Создать собственное свойство-аксессор с именем P объекта O, у которых значения атрибутов [[Get]], [[Set]], [[Enumerable]] и [[Configurable]] описывает Desc. Если значение поля атрибута Desc отсутствует, атрибуту только что созданного свойства присваивается его значение по умолчанию.
Вернуть true.
Вернуть true, если все поля в Desc отсутствуют.
Вернуть true, если все поля в Desc также встречаются в current, и значение каждого поля в Desc оказывается таким же, что и у соответствующего поля в current при сравнении с помощью алгоритма SameValue (9.12).
Если поле [[Configurable]] у current – false, то
Отказать, если поле [[Configurable]] у Desc – true.
Отказать, если имеется поле [[Enumerable]] у Desc, и поля [[Enumerable]] у current и Desc являются булевыми отрицаниями друг друга.
Если IsGenericDescriptor (Desc) – true, то дальнейшей проверки не требуется.
Иначе, если IsDataDescriptor(current) и IsDataDescriptor(Desc) имеют различные результаты, то
Отказать, если поле [[Configurable]] у current – false.
Если IsDataDescriptor( current ) – true, то
Преобразовать свойство с именем P объекта O из свойства данных в свойство-аксессор. Сохранить существующие значения атрибутов [[Configurable]] и [[Enumerable]] преобразованных свойств и присвоить атрибутам остальных свойств их значения по умолчанию.
Преобразовать свойство с именем P объекта O из свойства-аксессора в свойство данных. Сохранить существующие значения атрибутов [[Configurable]] и [[Enumerable]] преобразованных свойств и присвоить атрибутам остальных свойств их значения по умолчанию.
Иначе, если и IsDataDescriptor(current) и IsDataDescriptor(Desc) – true , то
Если поле [[Configurable]] у current – false, то
Отказать, если поле [[Writable]] у current – false, и поле [[Writable]] у Desc – true.
Если поле [[Writable]] у current – false, то
Отказать, если у Desc имеется поле [[Value]] и SameValue(Desc.[[Value]], current.[[Value]]) – false.
иначе, поле [[Configurable]] у current – true, поэтому любое изменение является допустимым.
Если поле [[Configurable]] у current – false, то
Отказать, если у Desc имеется поле [[Set]] и SameValue(Desc.[[Set]], current.[[Set]]) – false.
Отказать, если у Desc имеется поле [[Get]] и SameValue(Desc.[[Get]], current.[[Get]]) – false.
Для каждого имеющегося поля атрибута у Desc присвоить значению этого поля атрибут с соответствующим именем, принадлежащий свойству с именем P объекта O.
Вернуть true.
Если же O – объект Array, он имеет более сложный внутренний метод [[DefineOwnProperty]], описанный в пункте 15.4.5.1.
ПРИМЕЧАНИЕ Шаг 10.b позволяет, чтобы любое поле у Desc отличалось от соответствующего поля у current, если поле [[Configurable]] у current – true. Он даже позволяет изменить [[Value]] свойства, у которого атрибут [[Writable]] – false. Это возможно, поскольку атрибут [[Configurable]] со значением true допускает эквивалентную последовательность вызовов, в которых сначала [[Writable]] присваивается true, устанавливает новое [[Value]], а затем [[Writable]] присваивается false.
Что такое поле «__v» в Mongoose?
Я использую Mongoose версию 3 с MongoDB версией 2.2. Я заметил, что в моих MongoDB документах появилось поле __v . Это как-то связано с версированием? Как он используется?
2 ответа
versionKey — это набор свойств для каждого документа при первом создании by Mongoose. Значение этого ключа содержит внутреннюю ревизию документ. Имя этого свойства документа настраивается. по умолчанию — __v .
Если это противоречит вашему приложению, вы можете настроить как таковой:
Классы скорости карт памяти — как разобраться и что брать
![]()
Объем карты памяти — не единственный важный показатель. При покупке также следует обращать внимание на классы скорости. Они определяют минимальную и максимальную скорости записи. Это актуально, если вы берете SD-карту для видеокамеры или видеорегистратора, когда на нее будет записываться постоянный поток данных. Мы рассмотрим существующие классы скорости и их ограничения.
Класс скорости для обычных карт
Для начала отметим, что все microSD-карты можно разделить на две группы: без поддержки и с поддержкой интерфейса UHS (Ultra High Speed). Бюджетные или достаточно старые модели карт памяти еще не располагают высокоскоростным интерфейсом, поэтому для них актуальная градация под названием Speed Class.
Обозначается в виде большой буквы C, нумерованной от 2 до 10.
![]()
Этот класс определяет минимальную скорость записи данных. Расшифровка достаточно простая — цифра соответствует скорости:
| Наименование | Скорость, МБ/с |
| Class 2 | 2 |
| Class 4 | 4 |
| Class 6 | 6 |
| Class 10 | 10 |
Таким образом, лучшая microSD-карта без поддержки интерфейса UHS способна предложить запись информации на скорости от 10 МБ/с. Максимальная скорость записи зависит от другого параметра, о котором мы поговорим позже.
Класс скорости UHS
Последние модели карт памяти имеют интерфейс UHS, который предлагает большую «производительность». На корпусе карты вы можете найти обозначение буквы U, в которой будут вписаны соответствующие цифры.
![]()
По аналогии с предыдущим классом, цифра обозначает минимальную скорость записи данных на карту:
| Наименование | Минимальная скорость записи, МБ/с |
| U1 | 10 |
| U3 | 30 |
Как видно, класс C10 соответствует U1 по минимальной скорости записи, однако карты памяти могут иметь различную максимальную скорость. Самые продвинутые карты по UHS предлагают от 30 МБ/с.
Класс скорости видео
В 2016 году была представлена спецификация SD 5.0, которая учитывала современную сферу использования SD-карт, включая 2К и 4К видео. В связи с этим появилась новая классификация под названием Video Speed Class. Под эту классификацию обычно попадают самые новые версии карт памяти. На их корпусе можно найти букву V и число, которое определяет минимальную скорость записи.
![]()
Поскольку эта одна из последних классификаций, то предлагает большие минимальные скорости:
| Наименование | Минимальная скорость записи, МБ/с |
| V6 | 6 |
| V10 | 10 |
| V30 | 30 |
| V60 | 60 |
| V90 | 90 |
Стандарт V10 соответствует C10 и U1— у таких карт будет идентичная минимальная скорость записи.
Класс скорости для работы с приложениями
В спецификации SD 5.1, была добавлена еще одна классификация, которая была ориентирована на использование карт памяти в смартфонах и других гаджетах. Появился дополнительно класс Application Performance Class.
![]()
Классы A1 и А2 имеют идентичную минимальную скорость записи — 10 МБ/с, но различаются количество операций ввода-вывода.
| Класс | Случайное чтение, IOPS | Случайная запись, IOPS |
| А1 | 1500 | 500 |
| А2 | 4000 | 2000 |
Чем выше IOPS (количестве операций ввода-вывода в секунду), тем быстрее будет работать приложение на смартфоне, планшете или другом устройстве, если оно установлено на карту памяти. Поскольку это одна из последних спецификаций, то далеко не все microSD имеют обозначения по А классу.
Поколение интерфейса UHS
С минимальной скоростью все понятно, достаточно посмотреть на число у самого новейшего класса на корпусе карты. Однако пользователя больше интересуют максимальные скорости. И здесь четкой классификации не существует. Все зависит от конкретного производителя, но вы можете определить максимальную теоретическую скорость, изучив поколение интерфейса (шины) UHS. Обозначается он римскими цифрами.
![]()
| Поколения интерфейса | Предельная скорость записи, МБ/с |
| I | 104 |
| II | 312 |
Использование шины UHS будет возможно только в том случае, если и гаджет поддерживает ее, иначе карта памяти будет работать по более старой версии шины. Существует также спецификация UHS-IIIс максимальной теоретической скоростью до 624 МБ/с, но карты памяти с этим поколением шины пока не появились.
Сводная таблица и реальные замеры
У многих пользователей все эти классы могут вызвать путаницу, поскольку некоторые из них накладываются друг на друга. Более того, совсем не понятно, как это соотносить с реальными задачами. Специально для этого мы сделаем общую таблицу со сферой применения для каждого класса карт памяти:
Минимальная скорость записи
Speed Class
UHS Class
Video Class
Применение
HD и FullHD (30 FPS)
FullHD (60 FPS) и запись онлайн трансляций
FullHDи 4K 60/120 FPS
Таким образом, для современных смартфонов и камер потребуется карта класса не ниже C10/U1/V10, чтобы без проблем писать ролики в FullHD. Для работы с 4К-видео необходима карта не ниже V30/U3.
Многие производители указывают в характеристиках карт памяти их скорость чтения и записи. Насколько правдивы эти данные? В лаборатории ДНС для многих карт были сделаны фактические замеры — информацию о самых популярных microSD мы сведем в общую таблицу.
| Модель | Заявления скорость чтения, МБ/с | Заявления скорость записи, МБ/с | Фактическая скорость чтения, МБ/с | Фактическая скорость записи, МБ/с |
| Samsung EVO Plus microSDXC 128 ГБ | 60 | 100 | 98,26 | 65,49 |
| Kingston Canvas Select Plus microSDXC 64 ГБ | 85 | 100 | 98,14 | 22,00 |
| San Disk Ultra microSDXC 128 ГБ | 100 | от 10 | 98,10 | 38,48 |
| Mirex microSDXC 64 ГБ | 104 | 45 | 94,27 | 13,63 |
| ADATA Prime microSDHC 32 ГБ | 90 | от 10 | 82,05 | 17,17 |
| Smartbuy microSDXC 128 ГБ | 80 | 50 | 97,57 | 38,55 |
Ситуация складывается следующая. По скорости чтения заявленные характеристики практически всегда соответствуют действительности. Небольшие отличия можно списать на размер и тип тестовых файлов, поскольку заявленные производителем значения получены при идеальных условиях.
Однако заявленная скорость записи практически для всех моделей не соответствует действительности. По факту карта памяти может записывать в 2-3 раза медленнее, чем указано в технических характеристиках. Однако все модели карт проходят порог минимальной скорости записи согласно указанному классу.
Если вам действительно важна скорость записи, то не стоит доверять данным от производителя — ориентируйтесь именно на минимальный класс (C, U, V), чтобы четко представлять хотя бы нижний предел фактической скорости.
Что значит v в свойствах
Ранее были рассмотрены примеры использования односторонней привязки с помощью интерполяции. Но кроме того, Vue 3 двустороннюю привязку. Для создания подобной привязки используется директива v-model . Однако стоит отметить, что эта директива может применяться только к html-элементам <input> , <select> , <textarea> и к компонентам Vue.
Рассмотрим на простом примере:
Здесь на странице определено текстовое поле input , которое с помощью директивы v-model привязано к свойству userName из объекта Vue. В этом случае нам не надо добавлять к текстовому полю обработчик события ввода, и в этом обработчике менять вручную значение свойства userName — оно изменится автоматически при изменении текста в текстовом поле. То есть сработает двусторонняя привязка.

То есть с одной стороны, текстовое поле получает значение из объекта Vue, а с другой стороны, объект Vue исходя из введенного в текстовое поле значения изменяет свое свойство.
Рассмотрим другой пример — определим программу вычисления площади прямоугольника:
В данном случае одно поле ввода привязано к свойству width, а другое — к свойству height. При введении значения в одно из этих полей автоматически будет перевычисляться площадь прямоугольника, которая выводится ниже.

Стоит отметить, что директива v-model игнорирует значения атрибутов value , checked и selected полей ввода, а для установки начального значения следует использовать свойства объекта из кода javascript.