forked from iliakan/es5
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathx8.html
executable file
·1363 lines (1352 loc) · 130 KB
/
x8.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="split chapter">
<head>
<meta charset="utf-8">
<title>8 Типы | ES5 на русском</title><link rel="stylesheet" href="style.css"><link href="x7.html" title="7 Лексические соглашения " rel="prev">
<link href="index.html" title="Содержание" rel="index">
<link href="x9.html" title="9 Преобразование и проверка типов " rel="next">
</head>
<body><div class="head">
<h2 id="top">Спецификация ECMAScript 5.1 с аннотациями <span id="timestamp"></span></h2>
<!--left..-->
<div id="slogan">
<div id="share-toggler">Поделиться</div>
<div class="share">
<a href="https://twitter.com/share" class="twitter-share-button" data-url="http://es5.javascript.ru/" data-lang="ru" data-size="large" data-count="horizontal">Твитнуть</a>
<div id="fb-root"></div>
<div style="margin-bottom:5px" class="fb-like" data-href="http://es5.javascript.ru" data-send="false" data-action="recommend" data-layout="button_count" data-width="300" data-show-faces="false" data-font="arial"></div>
<div class="vk-share-wrapper">
<script src="http://vkontakte.ru/js/api/share.js?9" charset="windows-1251"></script>
<script src="misc.js"></script>
</div>
<div style="margin-top:6px">
<g:plusone annotation="inline" href="http://es5.javascript.ru/" width="120" size="standard" style="vertical-align:middle"></g:plusone>
</div>
</div>
</div>
<!--..left-->
<div id="annotations">
</div>
<nav>
<a href="x7.html">← 7 Лексические соглашения </a> –
<a href="index.html" class="toc-nav">Содержание</a> –
<a href="x9.html">9 Преобразование и проверка типов →</a>
<ol class="toc"><li><a href="x8.html#x8" id="x8-toc">8 Типы</a>
<b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> <ol><li><a href="x8.html#x8.1" id="x8.1-toc">8.1 Тип Undefined</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.2" id="x8.2-toc">8.2 Тип Null</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.3" id="x8.3-toc">8.3 Тип Boolean</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.4" id="x8.4-toc">8.4 Тип String</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.5" id="x8.5-toc">8.5 Тип Number</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.6" id="x8.6-toc">8.6 Тип Object</a>
<b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> <ol><li><a href="x8.html#x8.6.1" id="x8.6.1-toc">8.6.1 Атрибуты свойства</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.6.2" id="x8.6.2-toc">8.6.2 Внутренние свойства и методы объекта</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li></ol></li><li><a href="x8.html#x8.7" id="x8.7-toc">8.7 Тип спецификации Reference</a>
<b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> <ol><li><a href="x8.html#x8.7.1" id="x8.7.1-toc">8.7.1 GetValue (V)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.7.2" id="x8.7.2-toc">8.7.2 PutValue (V, W)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li></ol></li><li><a href="x8.html#x8.8" id="x8.8-toc">8.8 Тип спецификации List</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.9" id="x8.9-toc">8.9 Тип спецификации Completion</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.10" id="x8.10-toc">8.10 Типы спецификации Property Descriptor и Property Identifier</a>
<b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> <ol><li><a href="x8.html#x8.10.1" id="x8.10.1-toc">8.10.1 IsAccessorDescriptor(Desc)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.10.2" id="x8.10.2-toc">8.10.2 IsDataDescriptor(Desc)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.10.3" id="x8.10.3-toc">8.10.3 IsGenericDescriptor(Desc)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.10.4" id="x8.10.4-toc">8.10.4 FromPropertyDescriptor(Desc)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.10.5" id="x8.10.5-toc">8.10.5 ToPropertyDescriptor(Obj)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li></ol></li><li><a href="x8.html#x8.11" id="x8.11-toc">8.11 Типы спецификации Lexical Environment и Environment Record</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12" id="x8.12-toc">8.12 Алгоритмы для внутренних методов объектов</a>
<b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> <ol><li><a href="x8.html#x8.12.1" id="x8.12.1-toc">8.12.1 [[GetOwnProperty]](P)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.2" id="x8.12.2-toc">8.12.2 [[GetProperty]](P)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.3" id="x8.12.3-toc">8.12.3 [[Get]](P)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.4" id="x8.12.4-toc">8.12.4 [[CanPut]](P)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.5" id="x8.12.5-toc">8.12.5 [[Put]](P, V, Throw)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.6" id="x8.12.6-toc">8.12.6 [[HasProperty]](P)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.7" id="x8.12.7-toc">8.12.7 [[Delete]](P, Throw)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.8" id="x8.12.8-toc">8.12.8 [[DefaultValue]](подсказка)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li><li><a href="x8.html#x8.12.9" id="x8.12.9-toc">8.12.9 [[DefineOwnProperty]](P, Desc, Throw)</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b> </li></ol></li></ol></li></ol></nav>
<h2 id="x8">8 Типы <a href="#x8">#</a> <a href="#x8-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h2>
<p>
Алгоритмы, рассматриваемые в данной спецификации, манипулируют значениями, у каждого из которых есть тип, к которому он относится. В данной главе описаны все возможные типы значений. Они делятся на две категории: <a href="#language-type">языковые типы</a> <em>language types</em> и <a href="#specification-type">типы спецификации</a> <em>specification types</em>.</p>
<p>
<dfn id="language-type">Языковые типы</dfn> соответствуют значениям, которыми непосредственно манипулирует создатель кода на языке ECMAScript. К языковым типам относятся: <a href="#x8.1">Undefined</a>, <a href="#x8.2">Null</a>, <a href="#x8.3">Boolean</a>, <a href="#x8.4">String</a>, <a href="#x8.5">Number</a> и <a href="#x8.6">Object</a>.</p>
<p>
<dfn id="specification-type">Типы спецификации </dfn> соответствуют мета-значениям, используемым в алгоритмах для описания семантики конструкций языка ECMAScript и <a href="#language-type">языковых типов</a> ECMAScript. К ним относятся типы <a href="#x8.7">Reference</a>, <a href="#x8.8">List</a>, <a href="#x8.9">Completion</a>, <a href="#x8.10">Property Descriptor</a>, <a href="#property-identifier">Property Identifier</a>, <a href="x10.html#x10.2">Lexical Environment</a> и <a href="x10.html#x10.2.1">Environment Record</a>. Значения типов спецификации представляют собой артефакты спецификации, которые вовсе не обязательно соответствуют каким-либо конкретным сущностям в реализации ECMAScript. Они могут использоваться для описания промежуточных результатов вычисления выражения ECMAScript, при этом такие значения не могут храниться как свойства объектов или значения переменных языка ECMAScript.</p>
<p>
В тексте данной спецификации выражение <dfn id="Type">"Type(<i>x</i>)"</dfn> используется в качестве сокращения для фразы "тип, к которому относится <i>x</i>", где "тип" означает языковой тип и тип спецификации, описываемые в данной главе.</p>
<h3 id="x8.1">8.1 Тип Undefined <a href="#x8.1">#</a> <a href="#x8.1-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Undefined <tt>Неопределенный</tt> имеет только одно значение – <b>undefined</b>. Всякая переменная, которой не было присвоено значения, имеет значение <b>undefined</b>.</p>
<h3 id="x8.2">8.2 Тип Null <a href="#x8.2">#</a> <a href="#x8.2-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Null имеет только одно значение – <b>null</b>.</p>
<h3 id="x8.3">8.3 Тип Boolean <a href="#x8.3">#</a> <a href="#x8.3-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Boolean <tt>Булев тип</tt> представляет собой логическую сущность, имеющую два значения – <b>true </b>и <b>false</b>.</p>
<h3 id="x8.4">8.4 Тип String <a href="#x8.4">#</a> <a href="#x8.4-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип String <tt>Строковый тип</tt> представляет собой множество всех конечных упорядоченных последовательностей, состоящих из 16-битовых беззнаковых целочисленных значений ("элементов") в количестве ноль или более. В целом тип String используется для представления текстовых данных в активной программе на ECMAScript, при этом каждый элемент в строке String рассматривается как значение кодовой единицы (см. <a href="x6.html#x6">Главу 6</a>). Каждый элемент считается занимающим свою позицию в последовательности, и все позиции этих элементов пронумерованы неотрицательными целыми числами. Первый элемент (если есть) находится в позиции 0, следующий элемент (если есть) – в позиции 1, и так далее. Длина строки представляет собой количество элементов в ней (то есть, 16-битовых значений). Пустая строка имеет нулевую длину и, следовательно, не содержит ни одного элемента.</p>
<p>
Если строка содержит реальные текстовые данные, каждый элемент считается отдельной кодовой единицей в формате UTF-16. Независимо от того, действительно ли UTF-16 является фактическим форматом хранения строки, символы в этой строке пронумерованы по их начальным позициям элементов, как если бы они были представлены именно в формате UTF-16. Все операции со строками (если явно указано иначе) интерпретируют их как недифференцированные 16-битовые беззнаковые целые. Они не обеспечивают нормализованной формы результирующей строки, и не гарантируют результатов, ориентированных на язык.</p>
<p><b>ПРИМЕЧАНИЕ</b> Основная цель этой схемы – сделать реализацию строки как можно проще и как можно более высокоэффективной. Смысл в том, чтобы текстовые данные, поступающие в среду выполнения извне (например, вводимые пользователем, полученные при считывании текста из файла, или скачанные из сети, и т.д.), преобразовывались в соответствии с Формой нормализации Юникода "С" еще до того, как их увидит активная программа. Обычно это происходит в то же время, когда входящий текст преобразовывается из своей исходной схемы кодирования символов в формат Юникода (при этом никаких дополнительных потерь не происходит). Поскольку рекомендуется, чтобы исходный код на ECMAScript был приведен в соответствие с Формой нормализации "С", строковые литералы будут гарантированно нормализованными (если гарантированно нормализованным является исходный текст), если они не содержат управляющих последовательностей Юникода.</p>
<h3 id="x8.5">8.5 Тип Number <a href="#x8.5">#</a> <a href="#x8.5-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Number <tt>Числовой тип</tt> имеет ровно 18437736874454810627 (то есть, 2<sup>64</sup><span class="symbol">−</span>2<sup>53</sup>+3) значений, представляющих собой 64-битовые значения с удвоенной точностью в формате IEEE 754 в соответствии со Стандартом IEEE для двоичной арифметики с плавающей точкой, за исключением того, что 9007199254740990 (то есть, 2<sup>53</sup><span class="symbol">−</span>2) индивидуальных значений "не число" по стандарту IEEE представлены в языке ECMAScript как одно специальное значение <b>NaN</b>. (Обратите внимание, что значение <b>NaN</b> получается в программе с помощью выражения <code><b>NaN</b></code>.) В некоторых реализациях разницу между различными значениями "не число" смог бы выявить внешний код, но такое поведение зависит от реализации. Для кода ECMAScript все значения NaN неотличимы друг от друга.</p>
<p>
Есть еще два специальные значения – <b>положительная Бесконечность </b>и <b>отрицательная Бесконечность</b>. Для краткости эти значения также передаются поясняющими символами <b>+</b><span class="symbol"><b>∞</b></span> и <span class="symbol"><b>−∞</b></span> соответственно. (Обратите внимание, что эти два бесконечные числовые значения образуются с помощью выражений <code><b>+Infinity</b></code> (или просто <code><b>Infinity</b></code>) и <code><b>-Infinity</b></code>.)</p>
<p>
Остальные 18437736874454810624 (то есть, 2<sup>64</sup><span class="symbol">−</span>2<sup>53</sup>) значения называются конечными числами. Половина из них является положительными числами, а другая половина – отрицательными. Для каждого конечного положительного числового значения существует соответствующее отрицательное значение такой же величины.</p>
<p>
Обратите внимание, что существует как <b>положительный ноль</b>, так и <b>отрицательный ноль</b>. Для краткости, эти значения также передаются поясняющими символами <b>+0</b> и <span class="symbol"><b>−</b></span><b>0</b> соответственно. (Обратите внимание, что эти два различные нулевые числовые значения образуются с помощью выражений <code><b>+0</b></code> (или просто <code><b><b>0</b></b></code>) и <code><b>-0</b></code>.)</p>
<p>
Остальные 18437736874454810622 (то есть, 2<sup>64</sup><span class="symbol">−</span>2<sup>53</sup><span class="symbol">−</span>2) конечные ненулевые значения бывают двух типов:</p>
<p>
18428729675200069632 (то есть, 2<sup>64</sup><span class="symbol">−</span>2<sup>54</sup>) из них являются нормализованными и имеют вид</p>
<p class="code-example">
<i>s</i> <span class="symbol">×</span> <i>m</i> <span class="symbol">×</span> 2<sup><i>e</i></sup></p>
<p>
где <i>s</i> равно +1 или <span class="symbol">−</span>1, <i>m</i> – положительное целое число меньше чем 2<sup>53</sup>, но не меньше чем 2<sup>52</sup>, а <i>e</i> – целое число от <span class="symbol">−</span>1074 до 971 включительно.</p>
<p>
Остальные 9007199254740990 (то есть, 2<sup>53</sup><span class="symbol">−</span>2) значения являются денормализованными и имеют вид</p>
<p class="code-example">
<i>s</i> <span class="symbol">×</span> <i>m</i> <span class="symbol">×</span> 2<sup><i>e</i></sup></p>
<p>
где <i>s</i> равно +1 или <span class="symbol">−</span>1, <i>m</i> – положительное целое число меньше чем 2<sup>52</sup>, а <i>e</i> равно <span class="symbol">−</span>1074.</p>
<p>
Обратите внимание, что все положительные и отрицательные целые числа, значение которых по модулю не превышает 2<sup>53</sup>, представимы типом Number (в действительности, целое число 0 имеет два представления: <code><b>+0</b></code> и <code><b>-0</b></code>).</p>
<p>
Конечное число имеет <I>нечётную значащую часть</I>, если оно является ненулевым числом и при этом целое число <i>m</i>, используемое для его выражения (в одной из двух приведенных выше форм), является нечётным. В противном случае оно имеет <I>чётную значащую часть</I>.</p>
<p>
В данной спецификации фраза "значение Number для <i>x</i>" <em>the Number value for <i>x</i></em>, где <i>x</i> представляет точную ненулевую вещественную математическую величину (которая может быть даже иррациональным числом типа <span class="symbol">π</span>), означает значение Number, выбранное следующим образом: рассмотрим множество всех конечных значений типа Number, без <span class="symbol"><b>−</b></span><b>0</b>, но с двумя дополнительными значениями, которые не представимы типом Number, а именно: 2<sup>1024</sup> (то есть, +1 <span class="symbol">×</span> 2<sup>53</sup><span class="symbol">×</span> 2<sup>971</sup>) и <span class="symbol">−</span>2<sup>1024</sup> (то есть, <span class="symbol">−</span>1 <span class="symbol">×</span> 2<sup>53</sup><span class="symbol">×</span> 2<sup>971</sup>). Выберем из этого множества элемент, наиболее близкий по значению к <i>x</i>. Если одинаково близкими являются два значения, выберем то, у которого чётная значащая часть. При этом считается, что два дополнительные значения 2<sup>1024</sup> и <span class="symbol">−</span>2<sup>1024</sup> имеют чётные значащие части. Наконец, если было выбрано 2<sup>1024</sup>, заменим его на <b>+</b><span class="symbol"><b>∞</b></span>; если было выбрано <span class="symbol">−</span>2<sup>1024</sup>, заменим его на <span class="symbol"><b>−∞</b></span>; если был выбран <b>+0, </b>заменим его на <span class="symbol"><b>−</b></span><b>0</b> лишь в том случае, если <i>x</i> менее нуля. Если выбрано любое другое значение, его следует использовать без изменений. Результатом будет являться значение Number для <i>x</i>. (Эта процедура в точности соответствует поведению режима "округления до ближайшего значения" в соответствии со стандартом IEEE 754.)</p>
<p>
Некоторые операторы ECMAScript обрабатывают только целые числа от <span class="symbol">−</span>2<sup>31</sup> до 2<sup>31</sup><span class="symbol">−</span>1 включительно, или от 0 до 2<sup>32</sup><span class="symbol">−</span>1 включительно. Эти операторы допускают любое значение типа Number, но предварительно они приводят каждое такое значение к одному из 2<sup>32</sup> целочисленных значений. Описание операторов <a href="x9.html#x9.5">ToInt32</a> и <a href="x9.html#x9.6">ToUint32</a> содержится в пунктах <a href="x9.html#x9.5">9.5</a> и <a href="x9.html#x9.6">9.6</a> соответственно.</p>
<h3 id="x8.6">8.6 Тип Object <a href="#x8.6">#</a> <a href="#x8.6-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Объект <em>Object</em> представляет собой набор свойств.<i> </i>Каждое свойство является либо именованным свойством данных, либо именованным свойством-аксессором, либо внутренним свойством.</p>
<ul><li><p>
<I>Именованное свойство данных</I> <em>named data property</em> ассоциирует имя со значением в языке ECMAScript и с набором булевых атрибутов.</p>
</li>
<li><p>
<I>Именованное свойство-аксессор </I> <em>named accessor property</em> ассоциирует имя с одной или двумя функциями доступа <em>accessor functions</em> и с набором булевых атрибутов. Функции доступа используются для хранения или извлечения значения в языке ECMAScript, связанного с этим свойством.
</p>
</li>
<li><p>
<I>Внутреннее свойство</I> <em>internal property</em> не имеет имени и не является напрямую доступным через операторов ECMAScript. Внутренние свойства существуют исключительно в целях спецификации.
</p>
</li></ul><p>
Именованные (не внутренние) свойства имеют два типа доступа: <i>get </i>и <i>put</i>, обозначающие извлечение и присвоение соответственно.</p>
<h4 id="x8.6.1">8.6.1 Атрибуты свойства <a href="#x8.6.1">#</a> <a href="#x8.6.1-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
Атрибуты используются в данной спецификации для определения и описания состояния именованных свойств. Именованное свойство данных ассоциирует имя с атрибутами, перечисленными в Таблице 5.</p>
<dl><dd>
<center>
<table width="709" border="2" bordercolor="#000000" cellpadding="8" cellspacing="0"><caption>Таблица 5. Атрибуты именованных свойств данных</caption>
<colgroup><col width="115"><col width="134"><col width="408"></colgroup><tbody><tr valign="TOP"><td width="115" bgcolor="#d8d8d8">
<p>
<i><b>Наименование</b></i></p>
</td>
<td width="134" bgcolor="#d8d8d8">
<p>
<i><b>Область значений</b></i></p>
</td>
<td width="408" bgcolor="#d8d8d8">
<p>
<i><b>Описание</b></i></p>
</td>
</tr><tr valign="TOP"><td width="115" height="8">
<p>
[[Value]]
</p>
</td>
<td width="134">
<p>
Любой <a href="#language-type">тип языка</a> ECMAScript </p>
</td>
<td width="408">
<p>
Значение, извлеченное посредством чтения свойства.</p>
</td>
</tr><tr valign="TOP"><td width="115" height="17">
<p>
[[Writable]]
</p>
</td>
<td width="134">
<p>
Boolean</p>
</td>
<td width="408">
<p>
Если <B>false</B>, то попытки кода на ECMAScript изменить атрибут [[Value]] данного свойства с помощью [[Put]] не возымеют успеха.</p>
</td>
</tr><tr valign="TOP"><td width="115" height="1">
<p>
[[Enumerable]]</p>
</td>
<td width="134">
<p>
Boolean</p>
</td>
<td width="408">
<p>
Если <B>true</B>, то данное свойство будет перечислено в "for-in" (см. <a href="x12.html#x12.6.4">12.6.4</a>). В противном случае данное свойство не будет участвовать в перечислении.</p>
</td>
</tr><tr valign="TOP"><td width="115" height="12">
<p>
[[Configurable]]</p>
</td>
<td width="134">
<p>
Boolean</p>
</td>
<td width="408">
<p>
Если <b>false</b>, то попытки удалить данное свойство, изменить его, сделав свойством-аксессором, или изменить его атрибуты (кроме [[Value]]) не возымеют успеха.</p>
</td>
</tr></tbody></table></center>
</dd></dl><p class="sm-btm">
Именованное свойство-аксессор ассоциирует имя с атрибутами, перечисленными в Таблице 6.</p>
<dl><dd>
<center>
<table width="709" border="2" bordercolor="#000000" cellpadding="8" cellspacing="0"><caption>Таблица 6. Атрибуты именованных свойство-аксессоров.</caption>
<colgroup><col width="115"><col width="131"><col width="411"></colgroup><tbody><tr valign="TOP"><td width="115" bgcolor="#c0c0c0">
<p align="CENTER" class="keep">
<i><b>Наименование</b></i></p>
</td>
<td width="131" bgcolor="#c0c0c0">
<p align="CENTER" class="keep">
<i><b>Область значений</b></i></p>
</td>
<td width="411" bgcolor="#c0c0c0">
<p align="CENTER" class="keep">
<i><b>Описание</b></i></p>
</td>
</tr><tr valign="TOP"><td width="115" height="25">
<p class="keep">
[[Get]]</p>
</td>
<td width="131">
<p class="keep">
Object <i>или </i>Undefined</p>
</td>
<td width="411">
<p class="keep">
Если значением является Object, это должен быть объект функции. Каждый раз, когда производится выполнение get-доступа некого свойства, вызывается внутренний метод функции [Call]] (<a href="#x8.6.2">8.6.2</a>) с пустым списком аргументов для возврата значения этого свойства.</p>
</td>
</tr><tr valign="TOP"><td width="115" height="25">
<p class="keep">
[[Set]]</p>
</td>
<td width="131">
<p class="keep">
Object <i>или </i>Undefined</p>
</td>
<td width="411">
<p class="keep">
Если значением является Object, это должен быть объект функции. Каждый раз, когда производится выполнение set-доступа некого свойства, вызывается внутренний метод функции [Call]] (<a href="#x8.6.2">8.6.2</a>) со списком аргументов, содержащим единственный аргумент – присвоенное значение. Действие внутреннего метода свойства [[Set]] может (хотя и не обязательно) повлиять на значение, возвращаемое последующими вызовами во внутренний метод свойства [[Get]].</p>
</td>
</tr><tr valign="TOP"><td width="115" height="45">
<p class="keep">
[[Enumerable]]</p>
</td>
<td width="131">
<p class="keep">
Boolean</p>
</td>
<td width="411">
<p class="keep">
Если <b>true</b>, данное свойство должно быть перечислено в "for-in" (см. <a href="x12.html#x12.6.4">12.6.4</a>). В противном случае это свойство не будет участвовать в перечислении.</p>
</td>
</tr><tr valign="TOP"><td width="115" height="27">
<p>
[[Configurable]]</p>
</td>
<td width="131">
<p>
Boolean</p>
</td>
<td width="411">
<p>
Если <B>false</B>, попытки удалить данное свойство, изменить его, сделав свойством данных, или изменить его атрибуты не возымеют успеха.</p>
</td>
</tr></tbody></table></center>
</dd></dl><p>
Если значение атрибута для именованного свойства (из списка выше – прим. перев.) не указано явно в данной спецификации, будет использоваться значение по умолчанию, приведенное в Таблице 7 ниже.</p>
<dl><dl><dl><dl><dl><dl><dd>
<center>
<table width="278" border="2" bordercolor="#000000" cellpadding="8" cellspacing="0"><caption>Таблица 7. Значения атрибутов по умолчанию</caption>
<colgroup><col width="129"><col width="113"></colgroup><tbody><tr valign="TOP"><td width="129" bgcolor="#c0c0c0">
<p align="CENTER" class="keep">
<b>Наименование атрибута</b></p>
</td>
<td width="113" bgcolor="#c0c0c0">
<p align="CENTER" class="keep">
<b>Значение по умолчанию</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p class="keep">
[[Value]]</p>
</td>
<td width="113">
<p class="keep">
<b>undefined</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p class="keep">
[[Get]]</p>
</td>
<td width="113">
<p class="keep">
<b>undefined</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p class="keep">
[[Set]]</p>
</td>
<td width="113">
<p class="keep">
<b>undefined</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p class="keep">
[[Writable]]</p>
</td>
<td width="113">
<p class="keep">
<b>false</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p class="keep">
[[Enumerable]]</p>
</td>
<td width="113">
<p class="keep">
<b>false</b></p>
</td>
</tr><tr valign="TOP"><td width="129">
<p>
[[Configurable]]</p>
</td>
<td width="113">
<p>
<b>false</b></p>
</td>
</tr></tbody></table></center>
</dd></dl></dl></dl></dl></dl></dl>
<h4 id="x8.6.2">8.6.2 Внутренние свойства и методы объекта <a href="#x8.6.2">#</a> <a href="#x8.6.2-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
В данной спецификации используются различные внутренние свойства для определения семантики значений объекта. Эти внутренние свойства не являются частью языка ECMAScript, их определение даётся в данной спецификации исключительно с пояснительной целью. Реализация ECMAScript должна вести себя, как если бы она создала внутренние свойства и работала с ними в соответствии с описаниями в данной спецификации. Названия внутренних свойств заключены в двойные квадратные скобки [[ ]]. Если при использовании алгоритмом какого-либо внутреннего свойства объекта данный объект не реализовывает это внутреннее свойство, будет сгенерировано исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
<p>
В Таблице 8 перечислены внутренние свойства, используемые в данной спецификации, которые применимы ко всем объектам ECMAScript. В Таблице 9 перечислены внутренние свойства, используемые в данной спецификации, которые применимы только к некоторым объектам ECMAScript. В этих таблицах описано поведение свойств родных объектов ECMAScript (если для некоторых видов родных объектов ECMAScript это поведение не будет описано иначе в данном документе). Объекты среды могут поддерживать эти внутренние свойства своим поведением, зависящим от реализации, если оно согласуется с ограничениями для конкретного объекта среды, описанными в данном документе.</p>
<p>
В столбце “Область типов значений” в этих таблицах указаны типы значений, связанные с внутренними свойствами. Названия типов означают типы, описанные в <a href="#x8">Главе 8</a>, с последующими дополнительными названиями. Слово “<i>любое</i>” означает, что это значение может быть любым <a href="#language-type">типом языка</a> ECMAScript. Слово “<i>примитивный </i>” означает Undefined, Null, Boolean, String или Number. <dfn id="SpecOp">“<i>SpecOp</i>”</dfn> означает, что данное внутреннее свойство является внутренним методом – предоставляемой реализацией процедурой, которая описывается абстрактной спецификацией операции. После “SpecOp” приводится список описательных имен параметров. Если имя параметра в точности совпадает с именем типа, значит это имя описывает тип этого параметра. Если “SpecOp” возвращает значение, тогда после списка его параметров идет символ “>”, а затем тип возвращаемого значения.</p>
<div align="RIGHT">
<center>
<table width="740" border="1" bordercolor="#000000" cellpadding="8" cellspacing="0" rules="ROWS"><caption>Таблица 8. Внутренние свойства, общие для всех объектов</caption>
<colgroup><col width="158"><col width="194"><col width="338"></colgroup><tbody><tr valign="TOP"><td width="158" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Внутреннее свойство</span></b></i></p>
</td>
<td width="194" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Область типов значений</span></b></i></p>
</td>
<td width="338" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Описание</span></b></i></p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Prototype]]</p>
</td>
<td width="194">
<p class="keep">
Object <i>или </i>Null</p>
</td>
<td width="338">
<p class="keep">
Прототип данного объекта.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Class]]</p>
</td>
<td width="194">
<p class="keep">
String</p>
</td>
<td width="338">
<p class="keep">
Строковое значение, означающее классификацию объектов, заданных спецификацией.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Extensible]]</p>
</td>
<td width="194">
<p class="keep">
Boolean</p>
</td>
<td width="338">
<p class="keep">
Если <b>true</b>, к объекту могут быть добавлены собственные свойства.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Get]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>) <i><b>→</b></i> любое</p>
</td>
<td width="338">
<p class="keep">
Возвращает значение именованного свойства.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[GetOwnProperty]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>) <i><b>→</b></i> </p>
<p class="keep">
Undefined <i>или</i> <a href="#x8.10">Property Descriptor</a></p>
</td>
<td width="338">
<p class="keep">
Возвращает <a href="#x8.10">Дескриптор свойства</a> именованного собственного свойства данного объекта, или <b>undefined </b>(в случае отсутствия).</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[GetProperty]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>) <i><b>→</b></i></p>
<p class="keep">
Undefined<i> или</i> <a href="#x8.10">Property Descriptor</a></p>
</td>
<td width="338">
<p class="keep">
Возвращает <a href="#fully-populated">полностью заполненный</a> <a href="#fully-populated">Дескриптор свойства</a> именованного свойства данного объекта, или <b>undefined </b>(в случае отсутствия).</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Put]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>, <i>любое, Boolean</i>)</p>
</td>
<td width="338">
<p class="keep">
Присваивает значению второго параметра заданное именованное свойство. Обработка отказов контролируется с помощью флага.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[CanPut]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>) <i><b>→</b></i> Boolean</p>
</td>
<td width="338">
<p class="keep">
Возвращает булево значение, означающее возможность выполнения операции [[Put]] с именем свойства <i>propertyName</i>.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[HasProperty]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName</i>) <i><b>→</b></i> Boolean</p>
</td>
<td width="338">
<p class="keep">
Возвращает булево значение, которое указывает, есть ли уже у данного объекта свойство с таким именем.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[Delete]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName, Boolean</i>) <i><b>→</b></i> Boolean</p>
</td>
<td width="338">
<p class="keep">
Удаляет из объекта заданное именованное собственное свойство. Обработка отказов контролируется с помощью флага.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[DefaultValue]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>Подсказка</i>) <i><b>→</b></i> <i>примитивный</i></p>
</td>
<td width="338">
<p class="keep">
Подсказка представляет собой строку. Возвращает значение по умолчанию для данного объекта.</p>
</td>
</tr><tr valign="TOP"><td width="158">
<p class="keep">
[[DefineOwnProperty]]</p>
</td>
<td width="194">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>propertyName, PropertyDescriptor, Boolean</i>) <i><b>→</b></i> Boolean</p>
</td>
<td width="338">
<p class="keep">
Создает или изменяет именованное собственное свойство таким образом, чтобы оно имело состояние, описанное <a href="#x8.10">Дексриптором свойства</a>. Обработка отказов контролируется с помощью флага.</p>
</td>
</tr></tbody></table></center>
</div>
<p>
Каждый объект, в том числе объект среды, должен реализовывать все внутренние свойства, перечисленные в Таблице 8. Однако внутренний метод [[DefaultValue]] для некоторых объектов может просто сгенерировать исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
<p>
Все объекты имеют внутреннее свойство [[Prototype]]. Значением этого свойства является либо <b>null</b>, либо объект. Это значение используется для реализации наследования. Может ли объект среды выступать в качестве свойства [[Prototype]] для родного объекта, зависит от реализации. Каждая цепочка свойств [[Prototype]] должна быть конечной длины (то есть, если начать с любого объекта и рекурсивно производить переход к внутреннему свойству [[Prototype]], то в результате должно обязательно получиться значение <b>null</b>). Именованные свойства данных объекта [[Prototype]] наследуются (то есть, видимы как свойства дочернего объекта) для get-доступа, но не наследуются для put-доступа, а именованные свойства-аксессоры наследуются как для get-доступа, так и для put-доступа.</p>
<p>
Каждый объект ECMAScript имеет внутреннее свойство [[Extensible]] с булевым значением, управляющее возможностью добавления к объекту именованных свойств. Если внутреннее свойство [[Extensible]] имеет значение <b>false</b>, добавление дополнительных именованных свойство к объекту невозможно. Кроме того, если значение [[Extensible]] – <b>false</b>, то значение внутренних свойств [[Class]] и [[Prototype]] данного объекта не может быть изменено. После того как значение внутреннего свойства [[Extensible]] было установлено в <b>false</b>, его уже невозможно изменить на <B>true</B>.</p>
<p><b>ПРИМЕЧАНИЕ</b> Данная спецификация не определяет операторов или встроенных функций языка ECMAScript, которые бы позволили программе изменить внутренние свойства [[Class]] или [[Prototype]] определенного объекта или поменять значение [[Extensible]] с <b>false</b> на <b>true</b>. Расширения языка, зависящие от конкретной реализации, которые изменяют [[Class]], [[Prototype]] или [[Extensible]], не должны нарушать инварианты, описанные в предыдущем параграфе.</p>
<p>
Значение внутреннего свойства [[Class]] определяется в данной спецификации для каждого вида встроенного объекта. Значением внутреннего свойства [[Class]] объекта среды может быть любое строковое значение, кроме перечисленных далее: <code><b>"Arguments"</b></code>, <code><b>"Array"</b></code>, <code><b>"Boolean"</b></code>, <code><b>"Date"</b></code>, <code><b>"Error"</b></code>, <code><b>"Function"</b></code>, <code><b>"JSON"</b></code>, <code><b>"Math"</b></code>, <code><b>"Number"</b></code>, <code><b>"Object"</b></code>, <code><b>"RegExp"</b></code> и <code><b>"String"</b></code>. Значение внутреннего свойства [[Class]] имеет внутреннее использование для различения различных видов объектов. Обратите внимание, что данная спецификация не предоставляет программе никаких средств для доступа к этому значению, кроме как посредством <code><b><a href="x15.2.html#x15.2.4.2">Object.prototype.toString</a></b></code> (см. <a href="x15.2.html#x15.2.4.2">15.2.4.2</a>).</p>
<p>
Если не указано иначе, общие внутренние методы родных объектов ECMAScript ведут себя, как описано в пункте <a href="#x8.12">8.12</a>. Несколько отличается реализация внутреннего метода [[DefineOwnProperty]] объектов Array (см. <a href="x15.4.html#x15.4.5.1">15.4.5.1</a>) и реализация внутреннего метода [[GetOwnProperty]] объектов String (см. <a href="x15.5.html#x15.5.5.2">15.5.5.2</a>). Объекты Arguments (<a href="x10.html#x10.6">10.6</a>) имеют другие реализации методов [[Get]], [[GetOwnProperty]], [[DefineOwnProperty]] и [[Delete]]. Объекты Function (<a href="x15.3.html#x15.3">15.3</a>) имеют другую реализацию метода [[Get]].</p>
<p>
Объекты среды могут реализовывать эти внутренние методы любым образом, если не указано иначе. Например, вполне возможно, что методы [[Get]] и [[Put]] для какого-либо конкретного объекта среды действительно извлекают и сохраняют значения свойства, но при этом метод [[HasProperty]] всегда генерирует <b>false</b>. Однако, если реализация не поддерживает какой-либо конкретной обработки внутренних свойств объекта среды, при попытке такой обработки будет сгенерировано исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
<p class="sm-btm">
Внутренний метод [[GetOwnProperty]] объекта среды должен подчиняться следующим инвариантам для каждого свойства объекта среды:</p>
<ul><li><p>
Если свойство описано как свойство данных, при этом оно может со временем возвращать различные значения, тогда либо один из атрибутов [[Writable]] и [[Configurable], либо оба эти атрибута должны быть <b>true</b>, даже если через другие внутренние методы не излагается никакого механизма для изменения этого значения.</p>
</li>
<li><p>
Если свойство описано как свойство данных, и при этом и [[Writable]], и [[Configurable]] являются <b>false</b>, тогда по всем вызовам [[GetOwnProperty]] для атрибута [[Value]] этого свойства необходимо возвращать <a href="x9.html#x9.12">SameValue</a> <tt>Аналогичное значение</tt> в соответствии с п. <a href="x9.html#x9.12">9.12</a>.</p>
</li>
<li><p>
Если атрибуты кроме [[Writable]] со временем могут изменяться, или если это свойство может исчезнуть, тогда атрибут [[Configurable]] должен быть <b>true</b>.</p>
</li>
<li><p>
Если атрибут [[Writable]] может измениться с <b>false</b> на <b>true</b>, тогда атрибут [[Configurable]] должен быть <b>true</b>.</p>
</li>
<li><p>
Если в коде ECMAScript значение внутреннего свойства [[Extensible]] объекта среды соблюдалось как <b>false</b>, тогда, если вызов метода [[GetOwnProperty]] описывает свойство как несуществующее, то и все последующие вызовы также должны описывать это свойство как несуществующее.</p>
</li></ul><p>
Внутренний метод [[DefineOwnProperty]] объекта среды не должен позволять добавлять к объекту среды новое свойство, если в коде ECMAScript внутреннее свойство [[Extensible]] этого объекта среды соблюдалось как <b>false</b>.
</p>
<p>
Если в коде ECMAScript внутреннее свойство [[Extensible]] этого объекта среды соблюдалось как <b>false</b>, оно не должно впоследствии становиться <b>true</b>.</p>
<center>
<table width="765" border="1" bordercolor="#000000" cellpadding="8" cellspacing="0" rules="ROWS"><caption>Таблица 9. Внутренние свойства, определяемые только для некоторых объектов</caption>
<colgroup><col width="153"><col width="143"><col width="418"></colgroup><tbody><tr valign="TOP"><td width="153" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Внутреннее свойство</span></b></i></p>
</td>
<td width="143" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Область типов значений</span></b></i></p>
</td>
<td width="418" bgcolor="#c0c0c0">
<p>
<i><b><span class="table-header">Описание</span></b></i></p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[PrimitiveValue]]</p>
</td>
<td width="143">
<p class="keep">
<i>примитивный</i></p>
</td>
<td width="418">
<p class="keep">
Информация о внутреннем состоянии, связанная с этим объектом. Из всех стандартных встроенных объектов ECMAScript свойство [[PrimitiveValue]] реализуют только объекты Boolean, Date, Number и String.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[Construct]]</p>
</td>
<td width="143">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<a href="#x8.8">List</a> <i>любых</i>) <i><b>→</b> </i>Object</p>
</td>
<td width="418">
<p class="keep">
Создает объект. Вызывается посредством оператора <code><b>new</b></code>. Аргументами в <a href="#SpecOp">SpecOp</a> являются аргументы, передаваемые в оператор <b>new</b>. Объекты, реализующие этот внутренний метод, называются <i>конструкторами</i>.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
<dfn id="callable">[[Call]]</dfn></p>
</td>
<td width="143">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>любой</i>, <a href="#x8.8">List</a> <i>любых</i>) <i><b>→</b></i> <i>любой </i>или <a href="#x8.7">Reference</a></p>
</td>
<td width="418">
<p class="keep">
Исполняет код, связанный с объектом. Вызывается посредством выражения вызова функции. Аргументами в <a href="#SpecOp">SpecOp</a> являются объект this и список, содержащий аргументы, передаваемые в выражение вызова функции. Объекты, реализующие этот внутренний метод, являются <i>вызываемыми</i>. Возвращать значения <a href="#x8.7">Reference</a> могут только те вызываемые объекты, которые являются объектами среды.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[HasInstance]]</p>
</td>
<td width="143">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>любое</i>) <i><b>→</b></i> Boolean</p>
</td>
<td width="418">
<p class="keep">
Возвращает значение Boolean, которое указывает, возможно ли, что данный аргумент – это Object, который был создан данным объектом. Из всех стандартных встроенных объектов ECMAScript свойство [[HasInstance]] реализуют только объекты Function.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[Scope]]</p>
</td>
<td width="143">
<p class="keep">
<a href="x10.html#x10.2">Lexical Environment</a></p>
</td>
<td width="418">
<p class="keep">
<a href="x10.html#x10.2">Лексическое окружение</a>, определяющее окружение, в котором исполняется объект Function. Из всех стандартных встроенных объектов ECMAScript свойство [[Scope]] реализуют только объекты Function.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[FormalParameters]]</p>
</td>
<td width="143">
<p class="keep">
<a href="#x8.8">List</a> строк</p>
</td>
<td width="418">
<p class="keep">
Возможно пустой <a href="#x8.8">Список</a>, содержащий строки идентификатора <i>СпискаФормальныхПараметров</i> функции. Из всех стандартных встроенных объектов ECMAScript свойство [[FormalParameterList]] реализуют только объекты Function.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[Code]]</p>
</td>
<td width="143">
<p class="keep">
Код на ECMAScript</p>
</td>
<td width="418">
<p class="keep">
Код функции, написанный на ECMAScript. Из всех стандартных встроенных объектов ECMAScript свойство [[Code]] реализуют только объекты Function.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[TargetFunction]]</p>
</td>
<td width="143">
<p class="keep">
Объект</p>
</td>
<td width="418">
<p class="keep">
Целевая функция объекта функции, созданная посредством стандартного встроенного метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>. Внутреннее свойство [[TargetFunction]] имеют только объекты ECMAScript, созданные посредством метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[BoundThis]]</p>
</td>
<td width="143">
<p class="keep">
<i>любое</i></p>
</td>
<td width="418">
<p class="keep">
Предварительно связанное значение this объекта функции, созданного посредством стандартного встроенного метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>. Внутреннее свойство [[BoundThis]] имеют только объекты ECMAScript, созданные посредством метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p>
[[BoundArguments]]</p>
</td>
<td width="143">
<p>
<a href="#x8.8">List</a> <I>любых</I></p>
</td>
<td width="418">
<p>
Предварительно связанное значение аргументов объекта функции, созданного посредством стандартного встроенного метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>. Внутреннее свойство [[BoundArguments]] имеют только объекты ECMAScript, созданные посредством метода <a href="x15.3.html#x15.3.4.5">Function.prototype.bind</a>.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[Match]]</p>
</td>
<td width="143">
<p class="keep">
<a href="#SpecOp">SpecOp</a>(<i>Строка</i>, <i>индекс</i>) <i><b>→</b></i> <i><a href="x15.10.html#MatchResult">РезультатСличения</a></i></p>
</td>
<td width="418">
<p class="keep">
Производит сличение с регулярным выражением и возвращает значение <a href="x15.10.html#MatchResult">РезультатаСличения</a> (см. <a href="x15.10.html#x15.10.2.1">15.10.2.1</a>). Из всех стандартных встроенных объектов ECMAScript свойство [[Match]] реализуют только объекты RegExp.</p>
</td>
</tr><tr valign="TOP"><td width="153">
<p class="keep">
[[ParameterMap]]</p>
</td>
<td width="143">
<p class="keep">
Object</p>
</td>
<td width="418">
<p class="keep">
Выстраивает соответствия между свойствами объекта аргументов (см. <a href="x10.html#x10.6">10.6</a>) и формальными параметрами связанной с ними функции. Внутреннее свойство [[ParameterMap]] имеют только те объекты ECMAScript, которые являются объектами аргументов.</p>
</td>
</tr></tbody></table></center>
<h3 id="x8.7">8.7 Тип спецификации Reference <a href="#x8.7">#</a> <a href="#x8.7-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Reference <tt>Cсылка</tt> используется, чтобы объяснить поведение операторов <code><b>delete</b></code> и <code><b>typeof</b></code> и операторов присваивания.
Например, можно сказать, что "левосторонний операнд присваивания создаёт ссылку". Поведение операторов присваивания можно также объяснить и анализом синтаксической формы левостороннего оператора. Но здесь есть одна сложность: вызовы функции могут возвращать ссылки. Правда, эта возможность применима только к объектам среды: возврат ссылки не предусмотрен ни для функций ECMAScript, определяемых данной спецификацией, ни для функций, определяемых пользователем. (Еще один довод против синтаксического анализа заключается в том, что это было бы долго и неудобно, и затрагивало бы многие части спецификации.)</p>
<p>
<b>Reference</b> является предвычисленной <em>resolved</em> привязкой имени. Ссылка состоит из трех компонентов: значения <I>базы </I> <em>base value</em>, <I>имени по ссылке</I> <em>referenced name</em>, и флага <I>строгой ссылки</I> <em>strict reference</em> с булевым значением. Значение базы – это <b>undefined</b>, Object, Boolean, String, Number, или запись окружения (<a href="x10.html#x10.2.1">10.2.1</a>). Если значение базы – <b>undefined</b>, это означает, что значение по ссылке не удалось вычислить. Имя по ссылке – это строка.</p>
<p>
Для доступа к компонентам ссылок в данной спецификации используются следующие абстрактные операции:</p>
<ul><li><p><dfn id="GetBase">GetBase(V)</dfn> <tt>Получить базу(V)</tt>. Возвращает компонент со значением базы ссылки V.</p>
</li>
<li><p><dfn id="GetReferencedName">GetReferencedName(V)</dfn> <tt>Получить имя по ссылке(V)</tt>. Возвращает компонент имени по ссылке для ссылки V.</p>
</li>
<li><p><dfn id="IsStrictReference">IsStrictReference(V)</dfn> <tt>Является строгой ссылкой(V)</tt>. Возвращает компонент строгой ссылки для ссылки V.</p>
</li>
<li><p><dfn id="HasPrimitiveBase">HasPrimitiveBase(V)</dfn> <tt>Имеет примитивную базу(V)</tt>. Возвращает <b>true</b>, если значение базы – Boolean, String или Number.</p>
</li>
<li><p><dfn id="IsPropertyReference">IsPropertyReference</dfn>(V) <tt>Является ссылкой на свойство(V)</tt>. Возвращает <b>true</b>, если либо значение базы является объектом, либо <a href="#HasPrimitiveBase">HasPrimitiveBase</a>(V) – <b>true</b>; в противном случае возвращает <b>false</b>.</p>
</li>
<li><p><dfn id="IsUnresolvableReference">IsUnresolvableReference</dfn>(V) <tt>Является неразрешимой ссылкой(V)</tt>. Возвращает <b>true</b>, если значение базы – <b>undefined</b>, в противном случае возвращает <b>false</b>.</p>
</li></ul><p>
Для работы со ссылками в данной спецификации используются следующие абстрактные операции:</p>
<h4 id="x8.7.1">8.7.1 GetValue (V) <a href="#x8.7.1">#</a> <a href="#x8.7.1-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<ol><li><p>
Если <a href="#Type">Тип</a>(<i>V</i>) не является <a href->Reference</a>, вернуть <i>V</i>.</p>
</li>
<li><p>
Пусть <i>base </i>будет результатом вызова <a href="#GetBase">GetBase</a>(<i>V</i>).</p>
</li>
<li><p>
Если <a href="#IsUnresolvableReference">IsUnresolvableReference</a>(<i>V</i>), то сгенерировать исключение <b><a href="x15.11.html#x15.11.6.3" class="term-ref">ReferenceError</a></b>.</p>
</li>
<li><p>
Если <a href="#IsPropertyReference">IsPropertyReference</a>(<i>V</i>), то</p>
<ol><li><p>
Если <a href="#HasPrimitiveBase">HasPrimitiveBase</a>(<i>V</i>) – <b>false</b>, тогда пусть <i>get</i> будет внутренним методом [[Get]] для <i>base</i>, в противном случае пусть <i>get</i> будет специальным внутренним методом [[Get]], описанным далее.</p>
</li>
<li><p>
Вернуть результат вызова внутреннего метода <i>get</i>, используя <i>base </i>в качестве его значения <b>this</b>, и передавая как аргумент <a href="#GetReferencedName">GetReferencedName</a>(<i>V</i>).</p>
</li></ol></li>
<li><p>
Иначе, <i>base</i> должно быть <a href="x10.html#x10.2">environment record</a>.</p>
<ol><li><p>
Вернуть результат вызова конкретного метода GetBindingValue (см. <a href="x10.html#x10.2.1">10.2.1</a>) для <i>base</i>, передавая в качестве аргументов <a href="#GetReferencedName">GetReferencedName</a>(<i>V</i>) и <a href="#IsStrictReference">IsStrictReference</a>(<i>V</i>).</p>
</li></ol></li></ol><p>
Описанный ниже внутренний метод [[Get]] используется в GetValue, когда <i>V </i>является <a href="#IsPropertyReference">ссылкой на свойство</a> с примитивным значением базы. Этот внутренний метод вызывается с использованием <I>base </I>в качестве <b>this</b> и свойства <i>P</i> в качестве аргумента. При этом производятся следующие шаги:</p>
<ol><li><p>
Пусть <i>O</i> будет <a href="x9.html#x9.9">ToObject</a>(<i>base</i>).</p>
</li>
<li><p>
Пусть <i>desc </i>будет результатом вызова внутреннего метода [[GetProperty]] объекта <i>O </i> с именем свойства <i>P</i>.</p>
</li>
<li><p>
Если <i>desc</i> – <b>undefined</b>, вернуть <b>undefined</b>.</p>
</li>
<li><p>
Если <a href="#x8.10.2">IsDataDescriptor</a>(<i>desc</i>) – <b>true</b>, вернуть <i>desc</i>.[[Value]].</p>
</li>
<li><p>
В противном случае <a href="#x8.10.1">IsAccessorDescriptor</a>(<i>desc</i>) должен быть <b>true</b>, поэтому пусть <I>getter </I>будет <i>desc</i>.[[Get]].</p>
</li>
<li><p>
Если <i>getter </i>является <b>undefined</b>, вернуть <b>undefined</b>.</p>
</li>
<li><p>
Вернуть результат, вызывая внутренний метод [[Call]] для <I>getter</I><i>, </i>передавая <i>base </i>в качестве значения <b>this</b>, без аргументов.</p>
</li></ol><p><b>ПРИМЕЧАНИЕ</b> Объект, который может быть создан при выполнении шага 1, вне вышеуказанного метода недоступен. По выбору реализации фактическое создание этого объекта может не производиться.
Единственная ситуация, когда такой фактический доступ к свойству, использующий этот внутренний метод, может иметь видимый эффект – когда он вызывает функцию доступа <em>accessor function</em>.</p>
<h4 id="x8.7.2">8.7.2 PutValue (V, W) <a href="#x8.7.2">#</a> <a href="#x8.7.2-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<ol><li><p>
Если <a href="#Type">Тип</a>(<i>V</i>) не является <a href="#x8.7">Reference</a>, сгенерировать исключение <b><a href="x15.11.html#x15.11.6.3" class="term-ref">ReferenceError</a></b>.</p>
</li>
<li><p>
Пусть <i>base </i>будет результатом вызова <a href="#GetBase">GetBase</a>(<i>V</i>).</p>
</li>
<li><p>
Если <a href="#IsUnresolvableReference">IsUnresolvableReference</a>(<i>V</i>), то</p>
<ol><li><p>
Если <a href="#IsStrictReference">IsStrictReference</a>(<i>V</i>) – <b>true</b>, то</p>
<ol><li><p>
сгенерировать исключение <b><a href="x15.11.html#x15.11.6.3" class="term-ref">ReferenceError</a></b>.</p>
</li></ol></li>
<li><p>
Вызвать внутренний метод [[Put]] объекта <a href="x15.1.html#x15.1" class="term-ref">global object</a>, передавая в качестве имени свойства <a href="#GetReferencedName">GetReferencedName</a>(<i>V</i>), в качестве значения – <i>W</i> , а в качестве флага <I>Throw </I>– <b>false</b>.</p>
</li></ol></li>
<li><p>
Иначе если <a href="#IsPropertyReference">IsPropertyReference</a>(<i>V</i>), то</p>
<ol><li><p>
Если <a href="#HasPrimitiveBase">HasPrimitiveBase</a>(<i>V</i>) – <b>false</b>, тогда пусть <i>put</i> будет внутренним методом [[Put]] <i>base</i>, в противном случае пусть <i><i>put</i></i> будет специальным внутренним методом [[Put]], описанным далее.</p>
</li>
<li><p>
Вызвать внутренний метод <I>put</I>, используя <I>base </I>в качестве <B>this</B>, и передавая в качестве имени свойства <a href="#GetReferencedName">GetReferencedName</a>(<i>V</i>), в качестве значения – <i>W</i>, а в качестве флага <I>Throw </I> – <a href="#IsStrictReference">IsStrictReference</a>.</p>
</li></ol></li>
<li><p>
Иначе, <I>base </I>должна быть ссылкой, база которой – <a href="x10.html#x10.2">environment record</a>. Таким образом,</p>
<ol><li><p>
Вызвать конкретный метод SetMutableBinding (<a href="x10.html#x10.2.1">10.2.1</a>) для <i>base</i>, передавая в качестве аргументов <a href="#GetReferencedName">GetReferencedName</a>(<i>V</i>), <i>W</i> и <a href="#IsStrictReference">IsStrictReference</a>(<i>V</i>).</p>
</li></ol></li>
<li><p>
Вернуть результат.</p>
</li></ol><p>
Операция PutValue использует следующий внутренний метод [[Put]], когда <i>V </i> является <a href="#IsPropertyReference">ссылкой на свойство</a> с примитивным значением базы. Этот внутренний метод вызывается с использованием <i>base</i> в качестве его значения <b>this</b>, а его аргументами являются свойство <i>P</i>, значение <i>W</i> и булев флаг <i>Throw</i>. При этом производятся следующие шаги:</p>
<ol><li><p>
Пусть <i>O</i> будет <a href="x9.html#x9.9">ToObject</a>(<i>base</i>).</p>
</li>
<li><p>
Если результат вызова внутреннего метода [[CanPut]] объекта <i>O</i> с аргументом <i>P</i> – <b>false</b>, то</p>
<ol><li><p>
Если <i>Throw</i> – <b>true</b>, то сгенерировать исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
</li>
<li><p>
Иначе вернуть результат.</p>
</li></ol></li>
<li><p>
Пусть <i>ownDesc</i> будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта <i>O</i> с аргументом <i>P</i>.</p>
</li>
<li><p>
Если <a href="#x8.10.2">IsDataDescriptor</a>(<I>ownDesc</I>) – <b>true</b>, то</p>
<ol><li><p>
Если <i>Throw</i> – <b>true</b>, то сгенерировать исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
</li>
<li><p>
Иначе вернуть результат.</p>
</li></ol></li>
<li><p>
Пусть <i>desc</i> будет результатом вызова внутреннего метода [[GetProperty]] объекта <i>O</i> с аргументом <i>P</i>. Это может быть либо собственный или наследуемый <a href="#accessor-property-descriptor">дескриптор свойства-аксессора</a>, либо наследуемый <a href="#data-property-descriptor">дескриптор свойства данных</a>.</p>
</li>
<li><p>
Если <a href="#x8.10.1">IsAccessorDescriptor</a>(<I>desc</I>) – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>setter</i> будет <i>desc</i>.[[Set]], который не может быть <b>undefined</b>.</p>
</li>
<li><p>
Вызвать внутренний метод [[Call]] для <I>setter</I>, передавая <I>base </I>в качестве значения <b>this</b>, и список аргументов, содержащий только <i>W</i>.</p>
</li></ol></li>
<li><p>
Иначе, это – запрос на создание собственного свойства временного объекта <i>O.</i></p>
<ol><li><p>
Если <i>Throw</i> – <b>true</b>, то сгенерировать исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
</li></ol></li>
<li><p>
Вернуть результат.</p>
</li></ol><p><b>ПРИМЕЧАНИЕ</b> Объект, который может быть создан при выполнении шага 1, вне вышеуказанного метода недоступен. По выбору реализации фактическое создание этого временного объекта может не производиться. Единственные ситуации, когда возможен видимый эффект такого реального присваивания свойства, использующего этот внутренний метод – это когда он либо вызывает функцию доступа, либо нарушает контроль ошибок с предикатом <I>Throw</I>. Если <i>Throw</i> – <b>true</b>, то любое присваивание свойства, которое могло бы создать новое свойство временного объекта, вызовет ошибку.</p>
<h3 id="x8.8">8.8 Тип спецификации List <a href="#x8.8">#</a> <a href="#x8.8-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип List <tt>Cписок</tt> используется для описания вычисления списков аргументов (см. <a href="x11.html#x11.2.4">11.2.4</a>) в выражениях <code><b>new</b></code>, в вызовах функции, а также в других алгоритмах, в которых необходим простой список значений. Значения типа List представляют собой простые упорядоченные последовательности значений, которые могут быть любой длины.</p>
<h3 id="x8.9">8.9 Тип спецификации Completion <a href="#x8.9">#</a> <a href="#x8.9-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Completion <tt>Завершение</tt> используется для объяснения поведения инструкций (<code><b>break</b></code>, <code><b>continue</b></code>, <code><b>return</b></code> и <code><b>throw</b></code>), производящих нелокальную передачу управления. Значения типа Completion представляют собой триады в формате (<i>тип</i>, <i>значение</i>, <i>цель</i>), где <i>тип</i> – один из следующих: <b>normal</b>, <b>break</b>, <b>continue</b>, <b>return</b> или <b>throw</b>, <i>значение </i>– любое значение языка ECMAScript или <b>empty</b>, а <i>цель</i> – любой идентификатор ECMAScript или <B>empty</B>.</p>
<p>
Термин "непредвиденное завершение" <em>abrupt completion</em> означает любое завершение с типом, отличным от <b>normal</b>.</p>
<h3 id="x8.10">8.10 Типы спецификации Property Descriptor и Property Identifier <a href="#x8.10">#</a> <a href="#x8.10-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Тип Property Descriptor используется для объяснения манипуляций с атрибутами именованных свойств и для построения соответствующей модели данных. Значения типа Property Descriptor представляют собой записи, состоящие из именованных полей, где имя каждого поля является именем атрибута, а его значение является значением соответствующего атрибута, согласно <a href="#x8.6.1">п. 8.6.1</a>. Кроме того, любое поле может присутствовать или отсутствовать.</p>
<p>
И в зависимости от наличия или использования определенных полей, значения Property Descriptor еще делятся на дескрипторы свойств данных и дескрипторы свойств-аксессоров. <dfn id="data-property-descriptor">Дескриптор свойств данных</dfn> имеет поля с названием или [[Value]], или [[Writable]]. <dfn id="accessor-property-descriptor">Дескриптор свойств-аксессоров</dfn> имеет поля с названием или [[Get]], или [[Set]]. Любой дескриптор свойств может иметь поля с названием [[Enumerable]] и [[Configurable]]. Значение Property Descriptor не может быть одновременно и дескриптором свойств данных, и дескриптором свойств-аксессоров. Однако оно может одновременно являться ни тем, ни другим. Родовой дескриптор свойства (ориг. "generic property descriptor" – прим. перев.) представляет собой значение Property Descriptor, которое не является ни дескриптором свойств данных, ни дескриптором свойств-аксессоров. <dfn id="fully-populated">Полностью заполненный</dfn> дескриптор свойств является либо дескриптором свойств-аксессоров, либо дескриптором свойств данных, при этом все его поля соответствуют атрибутам свойства, описанных либо в Таблице 5, либо в Таблице 6 пункта <a href="#x8.6.1">8.6.1</a>.</p>
<p>
Для удобства обозначений в тексте данной спецификации может использоваться объектно-буквенный синтаксис для определения значения дескриптора свойства. Например, фраза: Property Descriptor {[[Value]]: 42, [[Writable]]: <b>false</b>, [[Configurable]]: <b>true</b>} определяет дескриптор свойств данных. Порядок имен полей не имеет значения. Поля, которые явно не указаны, считаются отсутствующими.</p>
<p>
В тексте и алгоритмах спецификации для указания на определенное поле Property Descriptor может использоваться написание через точку. Например, если D является дескриптором свойства, то фраза D.[[Value]] является сокращенным вариантом написания фразы “поле дескриптора D с именем [[Value]]”.</p>
<p>
Тип <dfn id="property-identifier">Property Identifier</dfn> <tt>Идентификатор свойства</tt> используется для связывания имени свойства с Дескриптором свойства. Значения типа Property Identifier представляют собой пары формата (имя, дескриптор), где имя – значение String, а дескриптор – значение Property Descriptor.
</p>
<p>
Для оперирования значениями Property Descriptor в данной спецификации используются следующие абстрактные операции:</p>
<h4 id="x8.10.1">8.10.1 IsAccessorDescriptor(Desc) <a href="#x8.10.1">#</a> <a href="#x8.10.1-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
При вызове абстрактной операции IsAccessorDescriptor <tt>Является дескриптором аксессора</tt> с <a href="#x8.10">дескриптором свойства</a> <i>Desc</i> выполняются следующие шаги:</p>
<ol><li><p>
<span class="tr">Если <i>Desc – </i><b>undefined</b>, вернуть <b>false</b>.</span></p>
</li>
<li><p>
<span class="tr">Если отсутствуют и <i>Desc</i>.[[Get]], и <i>Desc</i>.[[Set]], вернуть <b>false</b>.</span></p>
</li>
<li><p class="sm-btm">
<span class="tr">Вернуть <b>true</b>.</span></p>
</li></ol>
<h4 id="x8.10.2">8.10.2 IsDataDescriptor(Desc) <a href="#x8.10.2">#</a> <a href="#x8.10.2-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
При вызове абстрактной операции IsDataDescriptor <tt>Является дескриптором данных</tt> с <a href="#x8.10">дескриптором свойства</a> <i>Desc</i> выполняются следующие шаги:</p>
<ol><li><p>
<span class="tr">Если <i>Desc </i>– <b>undefined</b>, вернуть <b>false</b>.</span></p>
</li>
<li><p>
<span class="tr">Если отсутствуют и <i>Desc</i>.[[Value]], и <i>Desc</i>.[[Writable]], вернуть <b>false</b>.</span></p>
</li>
<li><p class="sm-btm">
<span class="tr">Вернуть <b>true</b>.</span></p>
</li></ol>
<h4 id="x8.10.3">8.10.3 IsGenericDescriptor(Desc) <a href="#x8.10.3">#</a> <a href="#x8.10.3-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
При вызове абстрактной операции IsGenericDescriptor с <a href="#x8.10">дескриптором свойства</a> <i>Desc</i> выполняются следующие шаги:</p>
<ol><li><p>
<span class="tr">Если <i>Desc </i>– <b>undefined</b>, вернуть <b>false</b>.</span></p>
</li>
<li><p>
<span class="tr">Если и <a href="#x8.10.1">IsAccessorDescriptor</a>(<i>Desc</i>) и <a href="#x8.10.2">IsDataDescriptor</a>(<i>Desc</i>) – <b>false</b>, вернуть <b>true</b>.</span></p>
</li>
<li><p class="sm-btm">
<span class="tr">Вернуть <b>false</b>.</span></p>
</li></ol>
<h4 id="x8.10.4">8.10.4 FromPropertyDescriptor(Desc) <a href="#x8.10.4">#</a> <a href="#x8.10.4-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
При вызове абстрактной операции FromPropertyDescriptor <tt>Из дескриптора свойства</tt> с <a href="#x8.10">дескриптором свойства</a> <i>Desc</i> выполняются следующие шаги:</p>
<p>
В следующем алгоритме предполагается, что <i>Desc </i>– <a href="#fully-populated">полностью заполненный</a> <a href="#x8.10">Property Descriptor</a>, такой, как дескриптор свойств, возвращенный методом [[GetOwnProperty]] (см. <a href="#x8.12.1">8.12.1</a>).</p>
<ol><li><p>
<span class="tr">Если <i>Desc </i><b>– undefined</b>, вернуть <b>undefined</b>.</span></p>
</li>
<li><p>
<span class="tr">Пусть <i>obj </i>будет результатом создания нового объекта, как если бы этот объект был создан выражением <b>new Object()</b>, где <b>Object </b>является стандартным встроенным конструктором с этим именем.</span></p>
</li>
<li><p>
<span class="tr">Если <a href="#x8.10.2">IsDataDescriptor</a>(<I>Desc</I>) – <b>true</b>, то </span>
</p>
<ol><li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>value</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Value]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span>
</p>
</li>
<li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>writable</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Writable]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span>
</p>
</li></ol></li>
<li><p>
<span class="tr">Иначе, <a href="#x8.10.1">IsAccessorDescriptor</a>(<i>Desc</i>) должен быть <b>true</b>, поэтому</span></p>
<ol><li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>get</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Get]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span></p>
</li>
<li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>set</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Set]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span>
</p>
</li></ol></li>
<li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>enumerable</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Enumerable]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span>
</p>
</li>
<li><p>
<span class="tr">Вызываем внутренний метод [[DefineOwnProperty]] объекта <i>obj</i> с аргументами "<code><b>configurable</b></code>", <a href="#x8.10">Property Descriptor</a> {[[Value]]: <i>Desc</i>.[[Configurable]], [[Writable]]: <b>true</b>, [[Enumerable]]: <b>true</b>, [[Configurable]]: <b>true</b>} и <b>false</b>.</span>
</p>
</li>
<li><p class="sm-btm">
<span class="tr">Вернуть <i>obj</i>.</span></p>
</li></ol>
<h4 id="x8.10.5">8.10.5 ToPropertyDescriptor(Obj) <a href="#x8.10.5">#</a> <a href="#x8.10.5-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h4>
<p>
При вызове абстрактной операции ToPropertyDescriptor <tt>В дескриптор свойства</tt> с объектом <I>Desc </I>выполняются следующие шаги:</p>
<ol><li><p>
Если <a href="#Type">Type</a>(<i>Obj</i>) – не Object, сгенерировать исключение <b>TypeError</b>.</p>
</li>
<li><p>
Пусть <i>desc</i> будет результатом создания нового <a href->Property Descriptor</a>, который вначале не имеет полей.</p>
</li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj </I>с аргументом "<code><b>enumerable</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>enum</i> будет результатом вызова внутреннего метода [[Get]] объекта <I>Obj </I>с аргументом "<code><b>enumerable</b></code>".</p>
</li>
<li><p>
Полю [[Enumerable]] дексриптора <I>desc </I>присвоить <a href="x9.html#x9.2">ToBoolean</a>(<i>enum</i>).</p>
</li></ol></li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj</I> с аргументом "<code><b>configurable</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>conf</i> будет результатом вызова внутреннего метода <I>Obj </I>[[Get]] с аргументом <code><b>configurable</b></code>".</p>
</li>
<li><p>
Полю [[Configurable]] дескриптора <I>desc </I>присвоить <a href="x9.html#x9.2">ToBoolean</a>(<i>conf</i>).</p>
</li></ol></li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj </I>с аргументом "<code><b>value</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <I>value</I> будет результатом вызова внутреннего метода [[Get]] объекта <I>Obj </I>с аргументом <code><b>value</b></code>".</p>
</li>
<li><p>
Полю [[Value]] дескриптора <I>desc </I>присвоить <i>value</i>.</p>
</li></ol></li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj </I>с аргументом "<code><b>writable</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>writable</i> будет результатом вызова внутреннего метода [[Get]] объекта <I>Obj </I>с аргументом <code><b>writable</b></code>".</p>
</li>
<li><p>
Полю [[Writable]] дескриптора <I>desc </I>присвоить <a href="x9.html#x9.2">ToBoolean</a>(<i>writable</i>).</p>
</li></ol></li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj </I>с аргументом "<code><b>get</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>getter </i>будет результатом вызова внутреннего метода [[Get]] объекта <I>Obj </I>с аргументом "<code><b>get</b></code>".</p>
</li>
<li><p>
Если <a href="x9.html#x9.11">IsCallable</a>(<i>getter</i>) – <b>false</b>, и <i>getter</i> не является <b>undefined</b>, то сгенерировать исключение <b>TypeError </b>exception</p>
</li>
<li><p>
Полю <I>desc </I>[[Get]] присвоить <I>getter</I>.</p>
</li></ol></li>
<li><p>
Если результат вызова внутреннего метода [[HasProperty]] объекта <I>Obj </I>с аргументом "<code><b>set</b></code>" – <b>true</b>, то</p>
<ol><li><p>
Пусть <i>setter</i> будет результатом вызова внутреннего метода [[Get]] объекта <I>Obj </I> с аргументом "<code>set</code>".</p>
</li>
<li><p>
Если <a href="x9.html#x9.11">IsCallable</a>(<I>setter</I>) – <b>false</b>, и <i>setter</i> не является <b>undefined</b>, то сгенерировать исключение <a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError </a>.</p>
</li>
<li><p>
Полю <I>desc </I>[[Set]] присвоить <i>setter</i>.</p>
</li></ol></li>
<li><p>
Если присутствует либо <i>desc</i>.[[Get]], либо <i>desc</i>.[[Set]], то</p>
<ol><li><p>
Если присутствует либо <i>desc</i>.[[Value]], либо <i>desc</i>.[[Writable]], то сгенерировать исключение <b><a href="x15.11.html#x15.11.6.5" class="term-ref">TypeError</a></b>.</p>
</li></ol></li>
<li><p>
Вернуть <i>desc</i>.</p>
</li></ol>
<h3 id="x8.11">8.11 Типы спецификации Lexical Environment и Environment Record <a href="#x8.11">#</a> <a href="#x8.11-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>
<p>
Типы <a href="x10.html#x10.2">Lexical Environment</a> <tt>Лексическое окружение</tt> и <a href="x10.html#x10.2.1">Environment Record</a> <tt>Запись окружения</tt> используются для объяснения поведения разрешения имён во вложенных функциях и блоках. Эти типы и операции с ними описаны в <a href="x10.html#x10">Главе 10</a>.</p>
<h3 id="x8.12">8.12 Алгоритмы для внутренних методов объектов <a href="#x8.12">#</a> <a href="#x8.12-toc" class="bak">Ⓣ</a> <b class="erra">Ⓔ</b> <b class="rev1">①</b> <b class="anno">Ⓐ</b></h3>