Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Спецификация Ecma-262. Пункт 8.7.2 PutValue(V,W) не до конца ясен алгоритм. (https://javascript.ru/forum/misc/24661-specifikaciya-ecma-262-punkt-8-7-2-putvalue-v-w-ne-do-konca-yasen-algoritm.html)

vandy3 09.01.2012 17:31

Спецификация Ecma-262. Пункт 8.7.2 PutValue(V,W) не до конца ясен алгоритм.
 
Здравствуйте.
В пункте 8.7.2 PutValue представлено два алгоритма: один основной, второй, если на шаге 4.a. первого получаем значение HasPrimitiveBase(V) === true - то для назначения свойства используется второй алгоритм.

Как я понимаю, во второй алгоритм мы попадаем, если пытаемся задать свойство объекту, которое у него есть и primitive type (Boolean, String, Number), как указано на предыдущей странице спецификации.

Если свойство можно записать, то мы попадаем на шаг 3. Где получаем Property Descriptor свойства. А так как мы хотим изменить свойство, которое есть у объекта и примитивного типа, то мы и должны, как я полагаю получить data descriptor. Но на следующем шаге, если мы получили data descriptor, то мы вообще либо Exception выкидываем, либо просто выходим из программы не назначая свойства.

По аналогии с предыдущим пунктом спецификации 8.7.1 GetValue, где в пункте 4 второго алгоритма, если это data descriptor, то мы возвращаем значение return desc.[[value]], так же и здесь, наверное, надо назначать свойство через desc.[[value]] = W, а мы выдаем ошибку и выходим.

Так же можете пояснить 1 шаг второго алгоритма, что значит toObject(base). В моем примере, как я понимаю, base это примитивное значение. Допустим было myObj.m = 33, то base будет равно 33, и что в таком случае значит 1. Let Obj be ToObject( 33 ) ?

Можно ещё привести небольшой код, с пояснением, в каком случае эти пункты работают, я так понимаю, когда мы пишем:

var myO = {};
myO.myName = 33;
/*
Здесь вступает в работу пункт 3 первого алгоритма из PutValue, так как свойства несуществует, то IsUnresolveableReference должна дать true, и так как у нас не strict mode, то мы выполняем 3.b

А дальше, если пишем:
*/
myO.myName = 55;
/*
То уже должен вступить пункт 4 в дело, и тут я перестаю понимать, что к чему.
*/


Часовой пояс GMT +3, время: 13:56.