Спецификация ECMAScript 5.1 с аннотациями

Поделиться

15.4 Объекты Array #

Объекты Array специальным образом обрабатывают определённые классы имён свойств. Имя свойства P (в форме строкового значения) является индексом массива array index только в том случае, если ToString(ToUint32(P)) равно P, а ToUint32(P) не равно 2321. Если имя свойства представляет собой индекс массива, такое свойство также называется элементом element. У каждого объекта Array есть свойство length, значение которого всегда представляет собой неотрицательное целое число меньше чем 232. Значение свойства length численно больше, чем имя каждого свойства, имя которого является индексом массива. Каждый раз при создании или изменении свойства объекта Array другие свойства по мере необходимости изменяются, чтобы сохранить этот инвариант. А именно: каждый раз при добавлении свойства, имя которого – индекс массива, при необходимости изменяется свойство length таким образом, чтобы оно на одну единицу превышало числовое значение этого индекса массива. А всякий раз при изменении свойства length автоматически удаляется каждое свойство, у которого имя – индекс массива, значение которого не меньше новой длины. Это ограничение применяется только к собственным свойствам объекта Array. На него не влияет свойство length или свойство индекса массива, которые могут быть унаследованы от его прототипов.

Объект O считается разреженным sparse, если следующий алгоритм возвращает значение true:

  1. Пусть len будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  2. Для каждого целого числа i в пределах 0≤i<ToUint32(len)

    1. Пусть elem будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом ToString(i).

    2. Если elem – undefined, вернуть true.

  3. Вернуть false.

15.4.1 Вызов конструктора Array как функции #

При вызове Array не в качестве конструктора, а в качестве функции, создается и инициализируется новый объект Array. Таким образом, вызов функции Array() эквивалентен выражению для создания объекта new Array() с теми же аргументами.

15.4.1.1 Array ( [ item1 [ , item2 [ , … ] ] ] ) #

При вызове функции Array выполняются следующие шаги:

  1. Создать и вернуть новый объект Array, как если бы в выражении new был использован стандартный встроенный конструктор Array с такими же аргументами (15.4.2).

15.4.2 Конструктор Array #

Если Array вызывается как часть выражения new, он является конструктором, так как он инициализирует создаваемый объект.

15.4.2.1 new Array ( [ item0 [ , item1 [ , … ] ] ] ) #

Данное описание применяется только в том случае, если конструктору Array не передаётся ни одного аргумента, или передаётся два и более аргументов.

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Array, который представляет собой начальное значение свойства Array.prototype (15.4.3.1).

Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Array".

Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Свойство length создаваемого объекта устанавливается равным количеству аргументов.

Свойство 0 создаваемого объекта устанавливается равным аргументу item0 (если он передавался); свойство 1 создаваемого объекта устанавливается равным item1 (если он передавался); и, в целом, для всех имеющихся аргументов свойство k создаваемого объекта устанавливается равным аргументу номер k, при этом первый аргумент считается аргументом номер 0. Все эти свойства имеют атрибуты {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}.

15.4.2.2 new Array (len) #

Внутреннее свойство [[Prototype]] создаваемого объекта устанавливается равным исходному объекту-прототипу Array, который представляет собой начальное значение свойства Array.prototype (15.4.3.1). Внутреннее свойство [[Class]] создаваемого объекта устанавливается равным "Array". Внутреннее свойство [[Extensible]] создаваемого объекта устанавливается равным true.

Если аргумент len – Number, а ToUint32(len) равно len, то свойству length создаваемого объекта присваивается ToUint32(len). Если аргумент len – Number, а ToUint32(len) не равно len, генерируется исключение RangeError.

Если аргумент len – не Number, то свойство length создаваемого объекта устанавливается равным 1, а свойство 0 создаваемого объекта устанавливается равным len с атрибутами {[[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}.

15.4.3 Свойства конструктора Array #

Значением внутреннего свойства [[Prototype]] конструктора Array является объект-прототип Function (15.3.4).

В дополнение ко внутренним свойствам и к свойству length со значением 1, конструктор Array имеет следующие свойства:

15.4.3.1 Array.prototype #

Начальным значением Array.prototype является объект-прототип Array (15.4.4).

Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.

15.4.3.2 Array.isArray ( arg ) #

Функция isArray принимает один аргумент arg и возвращает булево значение true, если этот аргумент является объектом, у которого внутреннее свойство class равно "Array". В противном случае функция возвращает false. При этом выполняются следующие шаги:

  1. Если Type(arg) не Object, вернуть false.

  2. Если значение внутреннего свойства [[Class]] для arg равно "Array", вернуть true.

  3. Вернуть false.

15.4.4 Свойства объекта-прототипа Array #

Значением внутреннего свойства [[Prototype]] объекта-прототипа Array является стандартный встроенный объект-прототип Object (15.2.4).

Объект-прототип Array сам является массивом. Его значение [[Class]] равно "Array". Он имеет свойство length (с начальным значением +0) и специальный внутренний метод [[DefineOwnProperty]], описанный в пункте 15.4.5.1.

В приведённых ниже описаниях функций, которые являются свойствами объекта-прототипа Array, фраза "объект this" означает объект, который представляет собой значение this, переданное при вызове функции. Допускается, чтобы this являлось объектом, для которого значение внутреннего свойства [[Class]] не является "Array".

ПРИМЕЧАНИЕ Объект-прототип Array не имеет собственного свойства valueOf, но он наследует его от стандартного встроенного объекта-прототипа Object.

15.4.4.1 Array.prototype.constructor #

Начальным значением Array.prototype.constructor является стандартный встроенный конструктор Array.

15.4.4.2 Array.prototype.toString ( ) #

При вызове метода toString выполняются следующие шаги:

  1. Пусть array будет результатом вызова ToObject on the this value.

  2. Пусть func будет результатом вызова внутреннего метода [[Get]] для array с аргументом "join".

  3. Если IsCallable(func) равно false, то пусть func будет стандартным встроенным методом Object.prototype.toString (15.2.4.2).

  4. Вернуть результат вызова внутреннего метода [[Call]] для func, передавая array в качестве значения this и пустой список аргументов.

ПРИМЕЧАНИЕ Функция toString является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции toString к объекту среды зависит от реализации.

15.4.4.3 Array.prototype.toLocaleString ( ) #

Элементы массива преобразуются в строки посредством методов toLocaleString. Затем эти строки конкатенируются, разделённые экземплярами строки-разделителя, которая определяется в соответствии с языковыми настройками, обусловленными конкретной реализацией. Результат вызова этой функции должен быть аналогичным результату toString, за тем исключением, что результат этой функции должен соответствовать языковым настройкам конкретной реализации.

Результат вычисляется следующим образом:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть arrayLen будет результатом вызова внутреннего метода [[Get]] для array с аргументом "length".

  3. Пусть len будет ToUint32(arrayLen).

  4. Пусть separator будет строковым значением строки-разделителя списка, соответствующим языковым настройкам текущей среды (определяется в зависимости от реализации).

  5. Если len – ноль, вернуть пустую строку.

  6. Пусть firstElement будет результатом вызова внутреннего метода [[Get]] для array с аргументом "0".

  7. Если firstElement равно undefined или null, то

    1. Пусть R будет пустой строкой.

  8. Иначе

    1. Песть elementObj будет ToObject(firstElement).

    2. Пусть func будет результатом вызова внутреннего метода [[Get]] для elementObj с аргументом "toLocaleString".

    3. Если IsCallable(func) – false, сгенерировать исключение TypeError.

    4. Пусть R будет результатом вызова внутреннего метода [[Call]] для func с передачей elementObj в качестве значения this и с пустым списком аргументов.

  9. Пусть k будет 1.

  10. Повторить, пока k < len

    1. Пусть S будет строковым значением, полученным в результате конкатенации R и разделителя separator.

    2. Пусть nextElement будет результатом вызова внутреннего метода [[Get]] для array с аргументом ToString(k).

    3. Если nextElement равно undefined или null, то

      1. Пусть R будет пустой строкой.

    4. Иначе

      1. Пусть elementObj будет ToObject(nextElement).

      2. Пусть func будет результатом вызова внутреннего метода [[Get]] для elementObj с аргументом "toLocaleString".

      3. Если IsCallable(func) – false, сгенерировать исключение TypeError.

      4. Пусть R будет результатом вызова внутреннего метода [[Call]] для func с передачей elementObj в качестве значения this и с пустым списком аргументов.

    5. Пусть R будет строковым значением, полученным в результате конкатенации S и R.

    6. Увеличить k на 1.

  11. Вернуть R.

ПРИМЕЧАНИЕ 1 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.

ПРИМЕЧАНИЕ 2 Функция toLocaleString является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции toLocaleString к объекту среды зависит от реализации.

15.4.4.4 Array.prototype.concat ( [ item1 [ , item2 [ , … ] ] ] ) #

При вызове метода concat с аргументами в количестве ноль или более (item1, item2, и т.д.) он возвращает массив, содержащий элементы массива объекта, за которыми следуют элементы массива каждого аргумента по порядку.

При этом выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  3. Пусть n будет 0.

  4. Пусть items будет внутренним списком List, где первый элемент – O, а последующие элементы слева направо – аргументы, которые были переданы при этом вызове функции.

  5. Повторять, пока items не равно пусто

    1. Удалить из items первый элемент, и пусть E будет значением этого элемента.

    2. Если значение внутреннего свойства [[Class]] для E равно "Array", то

      1. Пусть k будет 0.

      2. Пусть len будет результатом вызова внутреннего метода [[Get]] для E с аргументом "length".

      3. Повторить, пока k < len

        1. Пусть P будет ToString(k).

        2. Пусть exists будет результатом вызова внутреннего метода [[HasProperty]] для E с аргументом P.

        3. Если exists true, то

          1. Пусть subElement будет результатом вызова внутреннего метода [[Get]] для E с аргументом P.

          2. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: subElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

        4. Увеличить n на 1.

        5. Увеличить k на 1.

    3. Иначе, E не является Array

      1. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: E, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

      2. Увеличить n на 1.

  6. Вернуть А.

Свойство length для метода concat равно 1.

ПРИМЕЧАНИЕ Функция concat является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции concat к объекту среды зависит от реализации.

15.4.4.5 Array.prototype.join (separator) #

Элементы массива преобразуются в строки, а затем эти строки конкатенируются, разделённые экземплярами разделителя separator. Если разделитель не передан, то в качестве разделителя используется одна запятая.

Метод join принимает один аргумент separator и выполяет следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenVal).

  4. Если separatorundefined, пусть separator будет строкой из одного символа ",".

  5. Пусть sep будет ToString(separator).

  6. Если len – ноль, вернуть пустую строку.

  7. Пусть element0 будет результатом вызова внутреннего метода [[Get]] для O с аргументом "0".

  8. Если element0undefined или null, пусть R будет пустой строкой. Иначе пусть R будет ToString(element0).

  9. Пусть k будет 1.

  10. Повторить, пока k < len

    1. Пусть S будет строковым значением, полученным в результате конкатенации R и sep.

    2. Пусть element будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).

    3. Если elementundefined или null, пусть next будет пустой строкой, иначе пусть next будет ToString(element).

    4. Пусть R будет строковым значением, полученным в результате конкатенации S и next.

    5. Увеличить k на 1.

  11. Вернуть R.

Свойство length для метода join равно 1.

ПРИМЕЧАНИЕ Функция join является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции join к объекту среды зависит от реализации.

15.4.4.6 Array.prototype.pop ( ) #

Последний элемент массива удаляется из массива и возвращается.

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenVal).

  4. Если len равно ноль,

    1. Вызвать внутренний метод [[Put]] для O с аргументами "length", 0 и true.

    2. Вернуть undefined.

  5. Иначе, len > 0

    1. Пусть indx будет ToString(len–1).

    2. Пусть element будет результатом вызова внутреннего метода [[Get]] для O с аргументом indx.

    3. Вызвать внутренний метод [[Delete]] для O с аргументами indx и true.

    4. Вызвать внутренний метод [[Put]] для O с аргументами "length", indx и true.

    5. Вернуть element.

ПРИМЕЧАНИЕ Функция pop является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции pop к объекту среды зависит от реализации.

15.4.4.7 Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] ) #

Аргументы добавляются в конец массива в порядке их появления. В результате вызова функции возвращается новая длина массива.

При вызове метода push с аргументами в количестве ноль или более (item1,item2, и т.д.) выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть n будет ToUint32(lenVal).

  4. Пусть items будет внутренним списком List, элементы которого слева направо – аргументы, переданные при этом вызове функции.

  5. Повторять, пока items не равно пусто

    1. Удалить из items первый элемент, и пусть E будет значением этого элемента.

    2. Вызвать внутренний метод [[Put]] для O с аргументами ToString(n), E и true.

    3. Увеличить n на 1.

  6. Вызвать внутренний метод [[Put]] для O с аргументами "length", n и true.

  7. Вернуть n.

Свойство length для метода push равно 1.

ПРИМЕЧАНИЕ Функция push является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции push к объекту среды зависит от реализации.

15.4.4.8 Array.prototype.reverse ( ) #

Элементы массива перестраиваются в обратном порядке, и этот объект является результатом, возвращаемым при вызове.

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenVal).

  4. Пусть middle будет floor(len/2).

  5. Пусть lower будет 0.

  6. Повторить, пока lower middle

    1. Пусть upper будет lenlower 1.

    2. Пусть upperP будет ToString(upper).

    3. Пусть lowerP будет ToString(lower).

    4. Пусть lowerValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом lowerP.

    5. Пусть upperValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом upperP.

    6. Пусть lowerExists будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом lowerP.

    7. Пусть upperExists будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом upperP.

    8. Если lowerExists равно true и upperExists равно true, то

      1. Вызвать внутренний метод [[Put]] для O с аргументами lowerP, upperValue и true.

      2. Вызвать внутренний метод [[Put]] для O с аргументами upperP, lowerValue и true.

    9. Если lowerExists равно false и upperExists равно true, то

      1. Вызвать внутренний метод [[Put]] для O с аргументами lowerP, upperValue и true.

      2. Вызвать внутренний метод [[Delete]] для O с аргументами upperP и true.

    10. Иначе, если lowerExists равно true и upperExists равно false, то

      1. Вызвать внутренний метод [[Delete]] для O с аргументами lowerP и true.

      2. Вызвать внутренний метод [[Put]] для O с аргументами upperP, lowerValue и true.

    11. Инача, lowerExists и upperExists равны false

      1. Действий не требуется.

    12. Увеличить lower на 1.

  7. Вернуть O.

ПРИМЕЧАНИЕ Функция reverse является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reverse к объекту среды зависит от реализации.

15.4.4.9 Array.prototype.shift ( ) #

Первый элемент массива удаляется из массива и возвращается.

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenVal).

  4. Если len равно ноль, то

    1. Вызвать внутренний метод [[Put]] для O с аргументами "length", 0 и true.

    2. Вернуть undefined.

  5. Пусть first будет результатом вызова внутреннего метода [[Get]] для O с аргументом "0".

  6. Пусть k будет 1.

  7. Повторить, пока k < len

    1. Пусть from будет ToString(k).

    2. Пусть to будет ToString(k–1).

    3. Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.

    4. Если fromPresent true, то

      1. Пусть fromVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.

      2. Вызвать внутренний метод [[Put]] для O с аргументами to, fromVal и true.

    5. Иначе, fromPresent равно false.

      1. Вызвать внутренний метод [[Delete]] для O с аргументами to и true.

    6. Увеличить k на 1.

  8. Вызвать внутренний метод [[Delete]] для O с аргументами ToString(len–1) и true.

  9. Вызвать внутренний метод [[Put]] для O с аргументами "length", (len–1) и true.

  10. Вернуть first.

ПРИМЕЧАНИЕ Функция shift является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции shift к объекту среды зависит от реализации.

15.4.4.10 Array.prototype.slice (start, end) #

Метод slice принимает два аргумента start и end и возвращает массив, содержащий элементы массива начиная с элемента start и до элемента (не включительно) end (или до конца массива, если end равно undefined). Если start имеет отрицательное значение, вместо него вычисляется length+start, где length равно длине массива. Если end имеет отрицательное значение, вместо него вычисляется length+end, где length равно длине массива. При этом выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  3. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  4. Пусть len будет ToUint32(lenVal).

  5. Пусть relativeStart будет ToInteger(start).

  6. Если relativeStart имеет отрицательное значение, пусть k будет max((len +relativeStart),0); иначе пусть k будет min(relativeStart,len).

  7. Если endundefined, пусть relativeEnd будет len; иначе пусть relativeEnd будет ToInteger(end).

  8. Если relativeEnd имеет отрицательное значение, пусть final будет max((len + relativeEnd),0); иначе пусть final будет min(relativeEnd,len).

  9. Пусть n будет 0.

  10. Повторить, пока k < final

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    4. Увеличить k на 1.

    5. Увеличить n на 1.

  11. Вернуть А.

Свойство length для метода slice равно 2.

ПРИМЕЧАНИЕ Функция slice является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции slice к объекту среды зависит от реализации.

15.4.4.11 Array.prototype.sort (comparefn) #

Производится сортировка элементов массива. Сортировка не обязательно устойчива (то есть, для элементов, которые сравниваются как равные, не обязательно сохраняется их первоначальный порядок). Если comparefn – не undefined, то эта функция принимает два аргумента, x и y, и возвращает отрицательное значение, если x < y, возвращает ноль, если x = y, и возвращает положительное значение, если x > y.

Пусть obj будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

Пусть len будет результатом применения Uint32 к результату вызова внутреннего метода [[Get]] для obj с аргументом "length".

Если comparefn не равно undefined и не является последовательной функцией сравнения элементов of массива (см. далее), поведение sort зависит от реализации.

Пусть proto будет значением внутреннего свойства [[Prototype]] объекта obj. Если proto не равно null, и при этом существует такое целое число j, чтобы выполнялись все приведённые ниже условия, то поведение sort зависит от реализации:

Поведение sort также зависит от реализации, если obj равен sparse, и при этом выполняется хотя бы одно из двух условий:

Поведение sort также зависит от реализации, если свойство индекса массива для obj, имя которого представляет собой неотрицательное целое число меньше len, является свойством-аксессором, или является свойством данных с атрибутом [[Writable]] равным false.

В противном случае выполняются следующие шаги:

  1. Выполнить обусловленную реализацией последовательность вызовов внутренних методов [[Get]], [[Put]] и [[Delete]] для obj и абстрактной операции SortCompare (описанной далее), где первый аргумент для каждого вызова внутренних методов [[Get]], [[Put]] или [[Delete]] является неотрицательным целым числом меньше len, и где аргументы для вызовов абстрактной операции SortCompare являются результатами предыдущих вызовов внутреннего метода [[Get]]. Аргумент throw для внутренних методов [[Put]] и [[Delete]] будет иметь значение true. Если obj не является sparse, вызов внутреннего метода [[Delete]] не должен производиться.

  2. Вернуть obj.

Возвращаемый объект должен обладать двумя следующими свойствами:

Здесь запись old[j] используется для обозначения гипотетического результата вызова внутреннего метода [[Get]] для obj с аргументом j перед выполнением этой функции, а запись new[j] используется для обозначения гипотетического результата вызова внутреннего метода [[Get]] для obj с аргументом j после выполнения этой функции.

Функция comparefn является последовательной функцией сравнения для набора значений S, при условии выполнения всех указанных ниже требований для всех значений a, b и c (возможно, одинаковых) в наборе S: Запись a <CF b означает comparefn(a,b) < 0; запись a =CF b означает comparefn(a,b) = 0 (любого знака); а запись a >CF b означает comparefn(a,b) > 0.

ПРИМЕЧАНИЕ Приведённые выше условия являются необходимыми и достаточными для того, чтобы обеспечить, что comparefn делит набор S на классы эквивалентности, и что эти классы эквивалентности полностью упорядочены.

При вызове абстрактной операции SortCompare с двумя аргументами j и k выполнятся следующие шаги:

  1. Пусть jString будет ToString(j).

  2. Пусть kString будет ToString(k).

  3. Пусть hasj будет результатом вызова внутреннего метода [[HasProperty]] для obj с аргументом jString.

  4. Пусть hask будет результатом вызова внутреннего метода [[HasProperty]] для obj с аргументом kString.

  5. Если и hasj, и hask равны false, вернуть +0.

  6. Если hasj равно false, вернуть 1.

  7. Если hasj равно false, вернуть –1.

  8. Пусть x будет результатом вызова внутреннего метода [[Get]] для obj с аргументом jString.

  9. Пусть y будет результатом вызова внутреннего метода [[Get]] для obj с аргументом kString.

  10. Если и x, и y равны undefined, вернуть +0.

  11. Если x равно undefined, вернуть 1.

  12. Если y равно undefined, вернуть 1.

  13. Если аргумент comparefn не равен undefined, то

    1. Если IsCallable(comparefn) – false, сгенерировать исключение TypeError.

    2. Вернуть результат вызова внутреннего метода [[Call]] для comparefn, передавая undefined в качестве значения this, и аргументы x и y.

  14. Пусть xString будет ToString(x).

  15. Пусть yString будет ToString(y).

  16. Если xString < yString, вернуть 1.

  17. Если xString > yString, вернуть 1.

  18. Вернуть +0.

ПРИМЕЧАНИЕ 1 Поскольку несуществующие значения свойств всегда больше, чем значения undefined, а undefined всегда больше, чем любое другое значение, то свойства со значениями undefined при сортировке всегда оказываются в конце результирующего массива, а за ними следуют несуществующие значения свойств.

ПРИМЕЧАНИЕ 2 Функция sort является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции sort к объекту среды зависит от реализации.

15.4.4.12 Array.prototype.splice (start, deleteCount [ , item1 [ , item2 [ , … ] ] ] ) #

При вызове метода splice с двумя или более аргументами start, deleteCount и необязательными аргументами item1, item2 и т.д., элементы массива в количестве deleteCount, которые начинаются с индекса массива start, заменяются аргументами item1, item2 и т.д. Возвращается объект Array, содержащий удалённые элементы (если есть). При этом выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  3. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  4. Пусть len будет ToUint32(lenVal).

  5. Пусть relativeStart будет ToInteger(start).

  6. Если relativeStart имеет отрицательное значение, пусть actualStart будет max((len +relativeStart),0); иначе пусть actualStart будет min(relativeStart,len).

  7. Пусть actualDeleteCount будет min(max(ToInteger(deleteCount),0),len actualStart).

  8. Пусть k будет 0.

  9. Повторить, пока k < actualDeleteCount

    1. Пусть from будет ToString(actualStart+k).

    2. Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.

    3. Если fromPresent true, то

      1. Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.

      2. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(k), Property Descriptor {[[Value]]: fromValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    4. Увеличить k на 1.

  10. Пусть items будет внутренним списком List, элементы которого слева направо – часть фактического списка аргументов, начиная с item1. Если таких элементов нет, список будет пустым.

  11. Пусть itemCount будет количеством элементов в items.

  12. Если itemCount < actualDeleteCount, то

    1. Пусть k будет actualStart.

    2. Повторить, пока k < (lenactualDeleteCount)

      1. Пусть from будет ToString(k+actualDeleteCount).

      2. Пусть to будет ToString(k+itemCount).

      3. Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.

      4. Если fromPresent true, то

        1. Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.

        2. Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.

      5. Иначе, fromPresent равно false.

        1. Вызвать внутренний метод [[Delete]] для O с аргументами to и true.

      6. Увеличить k на 1.

    3. Пусть k будет len.

    4. Повторить, пока k > (len actualDeleteCount +itemCount)

      1. Вызвать внутренний метод [[Delete]] для O с аргументами ToString(k–1) и true.

      2. Уменьшить k на 1.

  13. Иначе, если itemCount > actualDeleteCount, то

    1. Пусть k будет (len actualDeleteCount).

    2. Повторить, пока k > actualStart

      1. Пусть from будет ToString(k + actualDeleteCount – 1).

      2. Пусть to будет ToString(k + itemCount – 1)

      3. Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.

      4. Если fromPresent true, то

        1. Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.

        2. Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.

      5. Иначе, fromPresent равно false.

        1. Вызвать внутренний метод [[Delete]] для O с аргументами to и true.

      6. Уменьшить k на 1.

  14. Пусть k будет actualStart.

  15. Повторять, пока items не равно пусто

    1. Удалить из items первый элемент, и пусть E будет значением этого элемента.

    2. Вызвать внутренний метод [[Put]] для O с аргументами ToString(k), E и true.

    3. Увеличить k на 1.

  16. Вызвать внутренний метод [[Put]] для O с аргументами "length", (len actualDeleteCount + itemCount) и true.

  17. Вернуть А.

Свойство length для метода splice равно 2.

ПРИМЕЧАНИЕ Функция splice является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции splice к объекту среды зависит от реализации.

15.4.4.13 Array.prototype.unshift ( [ item1 [ , item2 [ , … ] ] ] ) #

Аргументы вставляются в начало массива, при этом их порядок в массиве аналогичен тому порядку, в котором они были расположены в списке аргументов.

При вызове метода unshift с аргументами в количестве ноль или более (item1,item2, и т.д.) выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenVal).

  4. Пусть argCount будет количеством фактических аргументов.

  5. Пусть k будет len.

  6. Повторить, пока k > 0,

    1. Пусть from будет ToString(k–1).

    2. Пусть to будет ToString(k+argCount –1).

    3. Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.

    4. Если fromPresent true, то

      1. Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.

      2. Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.

    5. Иначе, fromPresent равно false.

      1. Вызвать внутренний метод [[Delete]] для O с аргументами to и true.

    6. Уменьшить k на 1.

  7. Пусть j будет 0.

  8. Пусть items будет внутренним списком List, элементы которого слева направо – аргументы, переданные при этом вызове функции.

  9. Повторять, пока items не равно пусто

    1. Удалить из items первый элемент, и пусть E будет значением этого элемента.

    2. Вызвать внутренний метод [[Put]] для O с аргументами ToString(j), E и true.

    3. Увеличить j на 1.

  10. Вызвать внутренний метод [[Put]] для O с аргументами "length", len+argCount и true.

  11. Вернуть len+argCount.

Свойство length для метода unshift равно 1.

ПРИМЕЧАНИЕ Функция unshift является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции unshift к объекту среды зависит от реализации.

15.4.4.14 Array.prototype.indexOf ( searchElement [ , fromIndex ] ) #

Метод indexOf сравнивает searchElement с элементами массива в порядке по возрастанию, используя Алгоритм сравнения строгого равенства (11.9.6). Если сравниваемый элемент найден в одной или нескольких позициях, возвращает индекс первой позиции. В противном случае возвращает -1.

Значение по умолчанию второго необязательного аргумента fromIndex равно 0 (то есть, производится поиск по всему массиву). Если его значение больше или равно длине массива, возвращается -1, то есть поиск по массиву не будет производиться. Если его значение отрицательно, он используется для смещения от конца массива для вычисления индекса fromIndex. Если вычисленный индекс меньше 0, будет производиться поиск по всему массиву.

При вызове метода indexOf с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если len равно 0, вернуть -1.

  5. Если был передан аргумент fromIndex, пусть n будет ToInteger(fromIndex); иначе пусть n будет 0.

  6. Если n len, вернуть -1.

  7. Если n ≥ 0, то

    1. Пусть k будет n.

  8. Иначе, n<0

    1. Пусть k будет len - abs(n).

    2. Если k меньше чем 0, пусть k будет 0.

  9. Повторить, пока k < len

    1. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом ToString(k).

    2. Если kPresent true, то

      1. Пусть elementK будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).

      2. Пусть same будет результатом применения Алгоритма сравнения строгого равенства к searchElement и к elementK.

      3. Если same равно true, вернуть k.

    3. Увеличить k на 1.

  10. Вернуть -1.

Свойство length для метода indexOf равно 1.

ПРИМЕЧАНИЕ Функция indexOf является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции indexOf к объекту среды зависит от реализации.

15.4.4.15 Array.prototype.lastIndexOf ( searchElement [ , fromIndex ] ) #

Метод lastIndexOf сравнивает searchElement с элементами массива в убывающем порядке, используя Алгоритм сравнения строгого равенства (11.9.6). Если сравниваемый элемент найден в одной или нескольких позициях, возвращает индекс последней позиции. В противном случае возвращает -1.

Значение по умолчанию второго необязательного аргумента fromIndex равно длине массива минус один (то есть, производится поиск по всему массиву). Если его значение больше или равно длине массива, будет производиться поиск по всему массиву. Если этот аргумент имеет отрицательное значение, оно используется для того, чтобы отступить от конца массива и получить индекс fromIndex. Если полученный индекс меньше 0, возвращается -1.

При вызове метода lastIndexOf с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если len равно 0, вернуть -1.

  5. Если был передан аргумент fromIndex, пусть n будет ToInteger(fromIndex); иначе пусть n будет len.

  6. Если n0, пусть k будет min(n, len – 1).

  7. Иначе, n < 0

    1. Пусть k будет len - abs(n).

  8. Повторить, пока k ≥ 0,

    1. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом ToString(k).

    2. Если kPresent true, то

      1. Пусть elementK будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).

      2. Пусть same будет результатом применения Алгоритма сравнения строгого равенства к searchElement и к elementK.

      3. Если same равно true, вернуть k.

    3. Уменьшить k на 1.

  9. Вернуть -1.

Свойство length для метода lastIndexOf равно 1.

ПРИМЕЧАНИЕ Функция lastIndexOf является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции lastIndexOf к объекту среды зависит от реализации.

15.4.4.16 Array.prototype.every ( callbackfn [ , thisArg ] ) #

Функция callbackfn – функция, принимающая три аргумента, и возвращающая значение, которое может быть приведено к булевому значению true или false. Метод every вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, пока не найдёт элемент, для которого callbackfn возвращает false. Как только такой элемент найден, every сразу же возвращает значение false. В противном случае, если функция callbackfn вернула значение true для всех элементов, every возвращает true. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.

Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, вместо него используется значение undefined.

Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.

Метод every не напрямую видоизменяет объект, для которого он вызывается, но этот объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает every, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова every. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит every. Элементы, которые удаляются после начала вызова every и перед их посещением, не будут посещены. Метод every действует как квантор "for all" в математике. В частности, для пустого массива он возвращает true.

При вызове метода every с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.

  6. Пусть k будет 0.

  7. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть testResult будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.

      3. Если ToBoolean(testResult) равно false, вернуть false.

    4. Увеличить k на 1.

  8. Вернуть true.

Свойство length для метода every равно 1.

ПРИМЕЧАНИЕ Функция every является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции every к объекту среды зависит от реализации.

15.4.4.17 Array.prototype.some ( callbackfn [ , thisArg ] ) #

Функция callbackfn – функция, принимающая три аргумента, и возвращающая значение, которое может быть приведено к булевому значению true или false. Метод some вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, пока не найдёт элемент, для которого callbackfn возвращает true. Как только такой элемент найден, some сразу же возвращает значение true. В противном случае some возвращает false. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.

Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.

Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.

Метод some не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает some, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова метода some. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит some. Элементы, которые удаляются после начала вызова some и перед их посещением, не будут посещены. Метод some действует как квантор "for all" в математике. В частности, для пустого массива он возвращает false.

При вызове метода some с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.

  6. Пусть k будет 0.

  7. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть testResult будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.

      3. Если ToBoolean(testResult) равно true, вернуть true.

    4. Увеличить k на 1.

  8. Вернуть false.

Свойство length для метода some равно 1.

ПРИМЕЧАНИЕ Функция some является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции some к объекту среды зависит от реализации.

15.4.4.18 Array.prototype.forEach ( callbackfn [ , thisArg ] ) #

Функция callbackfn – функция, принимающая три аргумента. Метод forEach вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.

Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.

Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.

Метод forEach не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает forEach, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова forEach. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callback, будет их значение в то время, как их посетит forEach. Элементы, которые удаляются после начала вызова метода forEach и перед их посещением, не будут посещены.

При вызове метода forEach с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.

  6. Пусть k будет 0.

  7. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Вызвать внутренний метод [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.

    4. Увеличить k на 1.

  8. Вернуть undefined.

Свойство length для метода forEach равно 1.

ПРИМЕЧАНИЕ Функция forEach является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции forEach к объекту среды зависит от реализации.

15.4.4.19 Array.prototype.map ( callbackfn [ , thisArg ] ) #

Функция callbackfn – функция, принимающая три аргумента. Метод map вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, и создаёт новый объект Array из полученных результатов. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.

Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.

Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.

Метод map не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает map, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова map. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит метод map. Элементы, которые удаляются после начала вызова map и перед их посещением, не будут посещены.

При вызове метода map с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.

  6. Пусть A будет новым массивом, как если бы он был создан выражением new Array( len), где Array является стандартным встроенным конструктором с этим именем, а len – значение для len.

  7. Пусть k будет 0.

  8. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть mappedValue будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.

      3. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами Pk, Property Descriptor {[[Value]]: mappedValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

    4. Увеличить k на 1.

  9. Вернуть А.

Свойство length для метода map равно 1.

ПРИМЕЧАНИЕ Функция map является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции map к объекту среды зависит от реализации.

15.4.4.20 Array.prototype.filter ( callbackfn [ , thisArg ] ) #

Функция callbackfn – функция, принимающая три аргумента, и возвращающая значение, которое может быть приведено к булевому значению true или false. filter вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, и создаёт новый массив из всех значений, для которых функция callbackfn возвращает значение true. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.

Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.

Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.

filter не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает filter, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова filter. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит filter. Элементы, которые удаляются после начала вызова filter и перед их посещением, не будут посещены.

При вызове метода filter с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.

  6. Пусть A будет новым массивом, как если бы он был создан выражением new Array(), где Array является стандартным встроенным конструктором с этим именем.

  7. Пусть k будет 0.

  8. Пусть to будет 0.

  9. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть selected будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.

      3. Если ToBoolean(selected) – true, то

        1. Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(to), Property Descriptor {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.

        2. Увеличить to на 1.

    4. Увеличить k на 1.

  10. Вернуть А.

Свойство length для метода filter равно 1.

ПРИМЕЧАНИЕ Функция filter является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции filter к объекту среды зависит от реализации.

15.4.4.21 Array.prototype.reduce ( callbackfn [ , initialValue ] ) #

callbackfn – функция, принимающая четыре аргумента. reduce вызывает callback в качестве функции по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке.

Функция callbackfn вызывается с четырьмя аргументами: previousValue (или значение от предыдущего вызова функции callbackfn), currentValue (значение текущего элемента), currentIndex и проходимый объект. Когда callback вызывается в первый раз, previousValue и currentValue могут иметь одно из двух значений. Если initialValue передавалось при вызове reduce, то previousValue будет равно initialValue, а currentValue будет равно первому значению в массиве. Если initialValue не передавалось, то previousValue будет равно первому значению в массиве, а currentValue будет равно второму. Если массив не содержит элементов, и при этом не передавалось значение initialValue, будет сгенерировано исключение TypeError.

reduce не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает reduce, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова reduce. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит reduce. Элементы, которые удаляются после начала вызова reduce и перед их посещением, не будут посещены.

При вызове метода reduce с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если len равно 0, и при этом initialValue отсутствует, сгенерировать исключение TypeError.

  6. Пусть k будет 0.

  7. Если присутствует initialValue, то

    1. Присвоить accumulator значение initialValue.

  8. Иначе, initialValue отсутствует

    1. Пусть kPresent будет false.

    2. Повторить, пока kPresent равно false и k < len

      1. Пусть Pk будет ToString(k).

      2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

      3. Если kPresent true, то

        1. Пусть accumulator будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      4. Увеличить k на 1.

    3. Если kPresent равно false, сгенерировать исключение TypeError.

  9. Повторить, пока k < len

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть accumulator будет результатом вызова внутреннего метода [[Call]] для callbackfn с undefined в качестве значения this и списком аргументов, содержащим accumulator, kValue, k и O.

    4. Увеличить k на 1.

  10. Вернуть accumulator.

Свойство length для метода reduce равно 1.

ПРИМЕЧАНИЕ Функция reduce является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reduce к объекту среды зависит от реализации.

15.4.4.22 Array.prototype.reduceRight ( callbackfn [ , initialValue ] ) #

callbackfn – функция, принимающая четыре аргумента. reduceRight вызывает callback в качестве функции по одному разу для каждого элемента, присутствующего в массиве в убывающем порядке.

Функция callbackfn вызывается с четырьмя аргументами: previousValue (или значение от предыдущего вызова callbackfn), currentValue (значение текущего элемента), currentIndex и проходимый объект. Когда эта функция вызывается в первый раз, previousValue и currentValue могут иметь одно из двух значений. Если initialValue передавалось при вызове reduceRight, то previousValue будет равно initialValue, а currentValue будет равно последнему значению в массиве. Если initialValue не передавалось, то previousValue будет равно последнему значению в массиве, а currentValue будет равно предпоследнему. Если массив не содержит элементов элементов, и при этом не передавалось значение initialValue, будет сгенерировано исключение TypeError.

reduceRight не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.

Диапазон элементов, которые обрабатывает reduceRight, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова reduceRight. Если функция callbackfn изменяет существующие элементы массива, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит reduceRight. Элементы, которые удаляются после начала вызова reduceRight и перед их посещением, не будут посещены.

При вызове метода reduceRight с одним или двумя аргументами выполняются следующие шаги:

  1. Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.

  2. Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".

  3. Пусть len будет ToUint32(lenValue).

  4. Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.

  5. Если len равно 0, и при этом initialValue отсутствует, сгенерировать исключение TypeError.

  6. Пусть k будет len-1.

  7. Если присутствует initialValue, то

    1. Присвоить accumulator значение initialValue.

  8. Иначе, initialValue отсутствует

    1. Пусть kPresent будет false.

    2. Повторить, пока kPresent равно false и k ≥ 0

      1. Пусть Pk будет ToString(k).

      2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

      3. Если kPresent true, то

        1. Пусть accumulator будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      4. Уменьшить k на 1.

    3. Если kPresent равно false, сгенерировать исключение TypeError.

  9. Повторить, пока k ≥ 0

    1. Пусть Pk будет ToString(k).

    2. Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.

    3. Если kPresent true, то

      1. Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.

      2. Пусть accumulator будет результатом вызова внутреннего метода [[Call]] для callbackfn с undefined в качестве значения this и списком аргументов, содержащим accumulator, kValue, k и O.

    4. Уменьшить k на 1.

  10. Вернуть accumulator.

Свойство length для метода reduceRight равно 1.

ПРИМЕЧАНИЕ Функция reduceRight является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reduceRight к объекту среды зависит от реализации.

15.4.5 Свойства экземпляров Array #

Экземпляры Array наследуют свойства объекта-прототипа Array. Значение их внутреннего свойства [[Class]] равно "Array". Кроме того, экземпляры Array обладают следующими свойствами:

15.4.5.1 [[DefineOwnProperty]] ( P, Desc, Throw ) #

Объекты Array используют разновидность внутреннего метода [[DefineOwnProperty]], используемую для других родных объектов ECMAScript (см. пункт 8.12.9).

Допустим, что A – объект Array, DescДескриптор свойства, а Throw – булев флаг.

В приведенном ниже алгоритме термин “Отказать” Reject означает “Если Throwtrue, то сгенерировать исключение TypeError, иначе вернуть false”.

При вызове внутреннего метода [[DefineOwnProperty]] объекта A со свойством P , дескриптором свойства Desc и булевым флагом Throw выполняются следующие шаги:

  1. Пусть oldLenDesc – результат вызова внутреннего метода [[GetOwnProperty]] для A с передачей "length" в качестве аргумента. Результат никогда не будет иметь значение undefined и не будет дескриптором аксессора, так как объекты Array создаются со свойством данных length, которое не может быть удалено или изменено.

  2. Пусть oldLen будет oldLenDesc.[[Value]].

  3. Если P равно "length", то

    1. Если поле [[Value]] для Desc отсутствует, то

      1. Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length", Desc и Throw .

    2. Пусть newLenDesc будет копией Desc.

    3. Пусть newLen будет ToUint32(Desc.[[Value]]).

    4. Если newLen не равно ToNumber( Desc.[[Value]]), сгенерировать исключение RangeError.

    5. Присвоить newLenDesc.[[Value] значение newLen.

    6. Если newLenoldLen, то

      1. Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length", newLenDesc и Throw .

    7. Отказ, если oldLenDesc.[[Writable]] равно false.

    8. Если newLenDesc.[[Writable]] отсутствует или имеет значение true, пусть newWritable будет true.

    9. Иначе

      1. Необходимо отложить присвоение атрибуту [[Writable]] значение false, если элементы не могут быть удалены.

      2. Пусть newWritable будет false.

      3. Присвоить newLenDesc.[[Writable] значение true.

    10. Пусть succeeded будет результатом вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length", newLenDesc и Throw .

    11. Если succeeded равно false, вернуть false.

    12. Пока newLen < oldLen повторить,

      1. Присвоить oldLen значение oldLen – 1.

      2. Пусть deleteSucceeded будет результатом вызова внутреннего метода [[Delete]] для A с передачей в качестве аргументов ToString(oldLen) и false.

      3. Если deleteSucceeded равно false, то

        1. Присвоить newLenDesc.[[Value] значение oldLen+1.

        2. Если newWritable равно false, присвоить newLenDesc.[[Writable] значение false.

        3. Вызвать внутренний метод [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length", newLenDesc и false.

        4. Отказ.

    13. Если newWritable равно false, то

      1. Вызвать внутренний метод по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей "length", Property Descriptor{[[Writable]]: false} и false в качестве аргументов. Этот вызов всегда будет возвращать значение true.

    14. Вернуть true.

  4. Иначе, если P – индекс массива (15.4), то

    1. Пусть index будет ToUint32(P).

    2. Отказ, если indexoldLen и oldLenDesc.[[Writable]] равно false.

    3. Пусть succeeded будет результатом вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов P, Desc и false.

    4. Отказ, если succeeded равно false.

    5. Если indexoldLen

      1. Присвоить oldLenDesc.[[Value]] значение index + 1.

      2. Вызвать внутренний метод [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length", oldLenDesc и false. Этот вызов всегда будет возвращать значение true.

    6. Вернуть true.

  5. Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов P, Desc и Throw.

15.4.5.2 length #

Свойство length данного объекта Array представляет собой свойство данных, значение которого всегда численно больше, чем имя каждого удаляемого свойства, имя которого является индексом массива.

Свойство length изначально имеет атрибуты { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.

ПРИМЕЧАНИЕ Попытка присвоить свойству length объекта Array значение, численно меньшее или равное самому большому числовому имени свойства неудаляемого индексированного свойства существующего массива приведёт к тому, что length будет иметь численное значение, на один больше, чем самое большое числовое имя свойства. См. 15.4.5.1.