Объекты Array специальным образом обрабатывают определённые классы имён свойств. Имя свойства P (в форме строкового значения) является индексом массива array index только в том случае, если ToString(ToUint32(P)) равно P, а ToUint32(P) не равно 232−1. Если имя свойства представляет собой индекс массива, такое свойство также называется элементом element. У каждого объекта Array есть свойство length
, значение которого всегда представляет собой неотрицательное целое число меньше чем 232. Значение свойства length
численно больше, чем имя каждого свойства, имя которого является индексом массива. Каждый раз при создании или изменении свойства объекта Array другие свойства по мере необходимости изменяются, чтобы сохранить этот инвариант. А именно: каждый раз при добавлении свойства, имя которого – индекс массива, при необходимости изменяется свойство length
таким образом, чтобы оно на одну единицу превышало числовое значение этого индекса массива. А всякий раз при изменении свойства length
автоматически удаляется каждое свойство, у которого имя – индекс массива, значение которого не меньше новой длины. Это ограничение применяется только к собственным свойствам объекта Array. На него не влияет свойство length
или свойство индекса массива, которые могут быть унаследованы от его прототипов.
Объект O считается разреженным sparse, если следующий алгоритм возвращает значение true:
Пусть len будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length".
Для каждого целого числа i в пределах 0≤i<ToUint32(len)
Пусть elem будет результатом вызова внутреннего метода [[GetOwnProperty]] объекта O с аргументом ToString(i).
Если elem – undefined, вернуть true.
Вернуть false.
При вызове Array
не в качестве конструктора, а в качестве функции, создается и инициализируется новый объект Array. Таким образом, вызов функции Array(
…
)
эквивалентен выражению для создания объекта new Array(
…
)
с теми же аргументами.
При вызове функции Array
выполняются следующие шаги:
Создать и вернуть новый объект Array, как если бы в выражении new
был использован стандартный встроенный конструктор Array
с такими же аргументами (15.4.2).
Если Array
вызывается как часть выражения new
, он является конструктором, так как он инициализирует создаваемый объект.
Данное описание применяется только в том случае, если конструктору 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}.
Внутреннее свойство [[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}.
Значением внутреннего свойства [[Prototype]] конструктора Array является объект-прототип Function (15.3.4).
В дополнение ко внутренним свойствам и к свойству length
со значением 1, конструктор Array имеет следующие свойства:
Начальным значением Array.prototype
является объект-прототип Array (15.4.4).
Это свойство имеет атрибуты { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }.
Функция isArray принимает один аргумент arg и возвращает булево значение true, если этот аргумент является объектом, у которого внутреннее свойство class равно "Array"
. В противном случае функция возвращает false. При этом выполняются следующие шаги:
Если Type(arg) не Object, вернуть false.
Если значение внутреннего свойства [[Class]] для arg равно "Array"
, вернуть true.
Вернуть false.
Значением внутреннего свойства [[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.
Начальным значением Array.prototype.constructor
является стандартный встроенный конструктор Array
.
При вызове метода toString
выполняются следующие шаги:
Пусть array будет результатом вызова ToObject on the this value.
Пусть func будет результатом вызова внутреннего метода [[Get]] для array с аргументом "join"
.
Если IsCallable(func) равно false, то пусть func будет стандартным встроенным методом Object.prototype.toString (15.2.4.2).
Вернуть результат вызова внутреннего метода [[Call]] для func, передавая array в качестве значения this и пустой список аргументов.
ПРИМЕЧАНИЕ Функция toString
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции toString
к объекту среды зависит от реализации.
Элементы массива преобразуются в строки посредством методов toLocaleString
. Затем эти строки конкатенируются, разделённые экземплярами строки-разделителя, которая определяется в соответствии с языковыми настройками, обусловленными конкретной реализацией. Результат вызова этой функции должен быть аналогичным результату toString
, за тем исключением, что результат этой функции должен соответствовать языковым настройкам конкретной реализации.
Результат вычисляется следующим образом:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть arrayLen будет результатом вызова внутреннего метода [[Get]] для array с аргументом "length"
.
Пусть len будет ToUint32(arrayLen).
Пусть separator будет строковым значением строки-разделителя списка, соответствующим языковым настройкам текущей среды (определяется в зависимости от реализации).
Если len – ноль, вернуть пустую строку.
Пусть firstElement будет результатом вызова внутреннего метода [[Get]] для array с аргументом "0"
.
Если firstElement равно undefined или null, то
Пусть R будет пустой строкой.
Иначе
Песть elementObj будет ToObject(firstElement).
Пусть func будет результатом вызова внутреннего метода [[Get]] для elementObj с аргументом "toLocaleString"
.
Если IsCallable(func) – false, сгенерировать исключение TypeError.
Пусть R будет результатом вызова внутреннего метода [[Call]] для func с передачей elementObj в качестве значения this и с пустым списком аргументов.
Пусть k будет 1
.
Повторить, пока k < len
Пусть S будет строковым значением, полученным в результате конкатенации R и разделителя separator.
Пусть nextElement будет результатом вызова внутреннего метода [[Get]] для array с аргументом ToString(k).
Если nextElement равно undefined или null, то
Пусть R будет пустой строкой.
Иначе
Пусть elementObj будет ToObject(nextElement).
Пусть func будет результатом вызова внутреннего метода [[Get]] для elementObj с аргументом "toLocaleString"
.
Если IsCallable(func) – false, сгенерировать исключение TypeError.
Пусть R будет результатом вызова внутреннего метода [[Call]] для func с передачей elementObj в качестве значения this и с пустым списком аргументов.
Пусть R будет строковым значением, полученным в результате конкатенации S и R.
Увеличить k на 1.
Вернуть R.
ПРИМЕЧАНИЕ 1 Первый параметр этой функции наверняка будет использоваться в будущей версии данного стандарта. Реализациям не рекомендуется использовать этот параметр для других целей.
ПРИМЕЧАНИЕ 2 Функция toLocaleString
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции toLocaleString
к объекту среды зависит от реализации.
При вызове метода concat
с аргументами в количестве ноль или более (item1, item2, и т.д.) он возвращает массив, содержащий элементы массива объекта, за которыми следуют элементы массива каждого аргумента по порядку.
При этом выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть A будет новым массивом, как если бы он был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть n будет 0.
Пусть items будет внутренним списком List, где первый элемент – O, а последующие элементы слева направо – аргументы, которые были переданы при этом вызове функции.
Повторять, пока items не равно пусто
Удалить из items первый элемент, и пусть E будет значением этого элемента.
Если значение внутреннего свойства [[Class]] для E равно "Array"
, то
Пусть k будет 0.
Пусть len будет результатом вызова внутреннего метода [[Get]] для E с аргументом "length
".
Повторить, пока k < len
Пусть P будет ToString(k).
Пусть exists будет результатом вызова внутреннего метода [[HasProperty]] для E с аргументом P.
Если exists – true, то
Пусть subElement будет результатом вызова внутреннего метода [[Get]] для E с аргументом P.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: subElement, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить n на 1.
Увеличить k на 1.
Иначе, E не является Array
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: E, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить n на 1.
Вернуть А.
Свойство length
для метода concat
равно 1.
ПРИМЕЧАНИЕ Функция concat
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции concat
к объекту среды зависит от реализации.
Элементы массива преобразуются в строки, а затем эти строки конкатенируются, разделённые экземплярами разделителя separator. Если разделитель не передан, то в качестве разделителя используется одна запятая.
Метод join
принимает один аргумент separator и выполяет следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Если separator – undefined, пусть separator будет строкой из одного символа ","
.
Пусть sep будет ToString(separator).
Если len – ноль, вернуть пустую строку.
Пусть element0 будет результатом вызова внутреннего метода [[Get]] для O с аргументом "0"
.
Если element0 – undefined или null, пусть R будет пустой строкой. Иначе пусть R будет ToString(element0).
Пусть k будет 1
.
Повторить, пока k < len
Пусть S будет строковым значением, полученным в результате конкатенации R и sep.
Пусть element будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).
Если element – undefined или null, пусть next будет пустой строкой, иначе пусть next будет ToString(element).
Пусть R будет строковым значением, полученным в результате конкатенации S и next.
Увеличить k на 1.
Вернуть R.
Свойство length
для метода join
равно 1.
ПРИМЕЧАНИЕ Функция join
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции join
к объекту среды зависит от реализации.
Последний элемент массива удаляется из массива и возвращается.
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Если len равно ноль,
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, 0 и true.
Вернуть undefined.
Иначе, len > 0
Пусть indx будет ToString(len–1).
Пусть element будет результатом вызова внутреннего метода [[Get]] для O с аргументом indx.
Вызвать внутренний метод [[Delete]] для O с аргументами indx и true.
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, indx и true.
Вернуть element.
ПРИМЕЧАНИЕ Функция pop
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции pop
к объекту среды зависит от реализации.
Аргументы добавляются в конец массива в порядке их появления. В результате вызова функции возвращается новая длина массива.
При вызове метода push
с аргументами в количестве ноль или более (item1,item2, и т.д.) выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть n будет ToUint32(lenVal).
Пусть items будет внутренним списком List, элементы которого слева направо – аргументы, переданные при этом вызове функции.
Повторять, пока items не равно пусто
Удалить из items первый элемент, и пусть E будет значением этого элемента.
Вызвать внутренний метод [[Put]] для O с аргументами ToString(n), E и true.
Увеличить n на 1.
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, n и true.
Вернуть n.
Свойство length
для метода push
равно 1.
ПРИМЕЧАНИЕ Функция push
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции push
к объекту среды зависит от реализации.
Элементы массива перестраиваются в обратном порядке, и этот объект является результатом, возвращаемым при вызове.
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Пусть middle будет floor(len/2).
Пусть lower будет 0.
Повторить, пока lower ≠ middle
Пусть upper будет len−lower −1.
Пусть upperP будет ToString(upper).
Пусть lowerP будет ToString(lower).
Пусть lowerValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом lowerP.
Пусть upperValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом upperP.
Пусть lowerExists будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом lowerP.
Пусть upperExists будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом upperP.
Если lowerExists равно true и upperExists равно true, то
Вызвать внутренний метод [[Put]] для O с аргументами lowerP, upperValue и true.
Вызвать внутренний метод [[Put]] для O с аргументами upperP, lowerValue и true.
Если lowerExists равно false и upperExists равно true, то
Вызвать внутренний метод [[Put]] для O с аргументами lowerP, upperValue и true.
Вызвать внутренний метод [[Delete]] для O с аргументами upperP и true.
Иначе, если lowerExists равно true и upperExists равно false, то
Вызвать внутренний метод [[Delete]] для O с аргументами lowerP и true.
Вызвать внутренний метод [[Put]] для O с аргументами upperP, lowerValue и true.
Инача, lowerExists и upperExists равны false
Действий не требуется.
Увеличить lower на 1.
Вернуть O.
ПРИМЕЧАНИЕ Функция reverse
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reverse
к объекту среды зависит от реализации.
Первый элемент массива удаляется из массива и возвращается.
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Если len равно ноль, то
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, 0 и true.
Вернуть undefined.
Пусть first будет результатом вызова внутреннего метода [[Get]] для O с аргументом "0"
.
Пусть k будет 1.
Повторить, пока k < len
Пусть from будет ToString(k).
Пусть to будет ToString(k–1).
Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.
Если fromPresent – true, то
Пусть fromVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.
Вызвать внутренний метод [[Put]] для O с аргументами to, fromVal и true.
Иначе, fromPresent равно false.
Вызвать внутренний метод [[Delete]] для O с аргументами to и true.
Увеличить k на 1.
Вызвать внутренний метод [[Delete]] для O с аргументами ToString(len–1) и true.
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, (len–1) и true.
Вернуть first.
ПРИМЕЧАНИЕ Функция shift
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции shift
к объекту среды зависит от реализации.
Метод slice
принимает два аргумента start и end и возвращает массив, содержащий элементы массива начиная с элемента start и до элемента (не включительно) end (или до конца массива, если end равно undefined). Если start имеет отрицательное значение, вместо него вычисляется length+start, где length равно длине массива. Если end имеет отрицательное значение, вместо него вычисляется length+end, где length равно длине массива. При этом выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть A будет новым массивом, как если бы он был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Пусть relativeStart будет ToInteger(start).
Если relativeStart имеет отрицательное значение, пусть k будет max((len +relativeStart),0); иначе пусть k будет min(relativeStart,len).
Если end – undefined, пусть relativeEnd будет len; иначе пусть relativeEnd будет ToInteger(end).
Если relativeEnd имеет отрицательное значение, пусть final будет max((len + relativeEnd),0); иначе пусть final будет min(relativeEnd,len).
Пусть n будет 0.
Повторить, пока k < final
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(n), Property Descriptor {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить k на 1.
Увеличить n на 1.
Вернуть А.
Свойство length
для метода slice
равно 2.
ПРИМЕЧАНИЕ Функция slice
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции slice
к объекту среды зависит от реализации.
Производится сортировка элементов массива. Сортировка не обязательно устойчива (то есть, для элементов, которые сравниваются как равные, не обязательно сохраняется их первоначальный порядок). Если 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
зависит от реализации:
0 ≤ j < len
Результат вызова внутреннего метода [[HasProperty]] для proto с аргументом ToString(j) равен true.
Поведение sort
также зависит от реализации, если obj равен sparse, и при этом выполняется хотя бы одно из двух условий:
Внутреннее свойство [[Extensible]] для obj равно false.
Свойство индекса массива для obj, имя которого представляет собой неотрицательное целое число меньше len, является свойством данных, у которого атрибут [[Configurable]] равен false.
Поведение sort
также зависит от реализации, если свойство индекса массива для obj, имя которого представляет собой неотрицательное целое число меньше len, является свойством-аксессором, или является свойством данных с атрибутом [[Writable]] равным false.
В противном случае выполняются следующие шаги:
Выполнить обусловленную реализацией последовательность вызовов внутренних методов [[Get]], [[Put]] и [[Delete]] для obj и абстрактной операции SortCompare (описанной далее), где первый аргумент для каждого вызова внутренних методов [[Get]], [[Put]] или [[Delete]] является неотрицательным целым числом меньше len, и где аргументы для вызовов абстрактной операции SortCompare являются результатами предыдущих вызовов внутреннего метода [[Get]]. Аргумент throw для внутренних методов [[Put]] и [[Delete]] будет иметь значение true. Если obj не является sparse, вызов внутреннего метода [[Delete]] не должен производиться.
Вернуть obj.
Возвращаемый объект должен обладать двумя следующими свойствами:
Должна иметь место математическая перестановка π неотрицательных целых чисел меньше len, так чтобы для каждого неотрицательного целого j меньше len, если свойство old[j] существовало, то свойсто new[π(j)] имеет точно такое же значение, что и old[j], но если свойства old[j]
не существовало, то и свойства new[π(j)] тоже не существует.
Тогда для всех неотрицательных целых чисел j и k, каждое из которых меньше len, если SortCompare(j,k) < 0
(см. SortCompare ниже), то π(j) < π(k).
Здесь запись 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(a,b) всегда возвращается одинаковое значение v при передаче в качестве двух аргументов некоторой пары значений a и b. Кроме того, Type(v) равно Number, а v не равно NaN. Обратите внимание, это подразумевает, что справедливым для некоторой пары a и b будет только одно из следующих равенств: a <CF b, a =CF b, и a >CF b.
Вызов comparefn(a,b) не изменяет объект this.
a =CF a (рефлексивность)
Если a =CF b, то b =CF a (симметрия)
Если a =CF b и b =CF c, то a =CF c (транзитивность =CF)
Если a <CF b и b <CF c, то a <CF c (транзитивность <CF)
Если a >CF b и b >CF c, то a >CF c (транзитивность >CF)
ПРИМЕЧАНИЕ Приведённые выше условия являются необходимыми и достаточными для того, чтобы обеспечить, что comparefn делит набор S на классы эквивалентности, и что эти классы эквивалентности полностью упорядочены.
При вызове абстрактной операции SortCompare с двумя аргументами j и k выполнятся следующие шаги:
Пусть jString будет ToString(j).
Пусть kString будет ToString(k).
Пусть hasj будет результатом вызова внутреннего метода [[HasProperty]] для obj с аргументом jString.
Пусть hask будет результатом вызова внутреннего метода [[HasProperty]] для obj с аргументом kString.
Если и hasj, и hask равны false, вернуть +0.
Если hasj равно false, вернуть 1.
Если hasj равно false, вернуть –1.
Пусть x будет результатом вызова внутреннего метода [[Get]] для obj с аргументом jString.
Пусть y будет результатом вызова внутреннего метода [[Get]] для obj с аргументом kString.
Если и x, и y равны undefined, вернуть +0.
Если x равно undefined, вернуть 1.
Если y равно undefined, вернуть −1.
Если аргумент comparefn не равен undefined, то
Если IsCallable(comparefn) – false, сгенерировать исключение TypeError.
Вернуть результат вызова внутреннего метода [[Call]] для comparefn, передавая undefined в качестве значения this, и аргументы x и y.
Пусть xString будет ToString(x).
Пусть yString будет ToString(y).
Если xString < yString, вернуть −1.
Если xString > yString, вернуть 1.
Вернуть +0.
ПРИМЕЧАНИЕ 1 Поскольку несуществующие значения свойств всегда больше, чем значения undefined, а undefined всегда больше, чем любое другое значение, то свойства со значениями undefined при сортировке всегда оказываются в конце результирующего массива, а за ними следуют несуществующие значения свойств.
ПРИМЕЧАНИЕ 2 Функция sort
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции sort
к объекту среды зависит от реализации.
При вызове метода splice
с двумя или более аргументами start, deleteCount и необязательными аргументами item1, item2 и т.д., элементы массива в количестве deleteCount, которые начинаются с индекса массива start, заменяются аргументами item1, item2 и т.д. Возвращается объект Array, содержащий удалённые элементы (если есть). При этом выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть A будет новым массивом, как если бы он был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Пусть relativeStart будет ToInteger(start).
Если relativeStart имеет отрицательное значение, пусть actualStart будет max((len +relativeStart),0); иначе пусть actualStart будет min(relativeStart,len).
Пусть actualDeleteCount будет min(max(ToInteger(deleteCount),0),len – actualStart).
Пусть k будет 0.
Повторить, пока k < actualDeleteCount
Пусть from будет ToString(actualStart+k).
Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.
Если fromPresent – true, то
Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(k), Property Descriptor {[[Value]]: fromValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить k на 1.
Пусть items будет внутренним списком List, элементы которого слева направо – часть фактического списка аргументов, начиная с item1. Если таких элементов нет, список будет пустым.
Пусть itemCount будет количеством элементов в items.
Если itemCount < actualDeleteCount, то
Пусть k будет actualStart.
Повторить, пока k < (len – actualDeleteCount)
Пусть from будет ToString(k+actualDeleteCount).
Пусть to будет ToString(k+itemCount).
Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.
Если fromPresent – true, то
Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.
Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.
Иначе, fromPresent равно false.
Вызвать внутренний метод [[Delete]] для O с аргументами to и true.
Увеличить k на 1.
Пусть k будет len.
Повторить, пока k > (len – actualDeleteCount +itemCount)
Вызвать внутренний метод [[Delete]] для O с аргументами ToString(k–1) и true.
Уменьшить k на 1.
Иначе, если itemCount > actualDeleteCount, то
Пусть k будет (len – actualDeleteCount).
Повторить, пока k > actualStart
Пусть from будет ToString(k + actualDeleteCount – 1).
Пусть to будет ToString(k + itemCount – 1)
Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.
Если fromPresent – true, то
Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.
Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.
Иначе, fromPresent равно false.
Вызвать внутренний метод [[Delete]] для O с аргументами to и true.
Уменьшить k на 1.
Пусть k будет actualStart.
Повторять, пока items не равно пусто
Удалить из items первый элемент, и пусть E будет значением этого элемента.
Вызвать внутренний метод [[Put]] для O с аргументами ToString(k), E и true.
Увеличить k на 1.
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, (len – actualDeleteCount + itemCount) и true.
Вернуть А.
Свойство length
для метода splice
равно 2.
ПРИМЕЧАНИЕ Функция splice
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции splice
к объекту среды зависит от реализации.
Аргументы вставляются в начало массива, при этом их порядок в массиве аналогичен тому порядку, в котором они были расположены в списке аргументов.
При вызове метода unshift
с аргументами в количестве ноль или более (item1,item2, и т.д.) выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenVal будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenVal).
Пусть argCount будет количеством фактических аргументов.
Пусть k будет len.
Повторить, пока k > 0,
Пусть from будет ToString(k–1).
Пусть to будет ToString(k+argCount –1).
Пусть fromPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом from.
Если fromPresent – true, то
Пусть fromValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом from.
Вызвать внутренний метод [[Put]] для O с аргументами to, fromValue и true.
Иначе, fromPresent равно false.
Вызвать внутренний метод [[Delete]] для O с аргументами to и true.
Уменьшить k на 1.
Пусть j будет 0.
Пусть items будет внутренним списком List, элементы которого слева направо – аргументы, переданные при этом вызове функции.
Повторять, пока items не равно пусто
Удалить из items первый элемент, и пусть E будет значением этого элемента.
Вызвать внутренний метод [[Put]] для O с аргументами ToString(j), E и true.
Увеличить j на 1.
Вызвать внутренний метод [[Put]] для O с аргументами "
length
"
, len+argCount и true.
Вернуть len+argCount.
Свойство length
для метода unshift
равно 1.
ПРИМЕЧАНИЕ Функция unshift
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции unshift
к объекту среды зависит от реализации.
Метод indexOf
сравнивает searchElement с элементами массива в порядке по возрастанию, используя Алгоритм сравнения строгого равенства (11.9.6). Если сравниваемый элемент найден в одной или нескольких позициях, возвращает индекс первой позиции. В противном случае возвращает -1.
Значение по умолчанию второго необязательного аргумента fromIndex равно 0 (то есть, производится поиск по всему массиву). Если его значение больше или равно длине массива, возвращается -1, то есть поиск по массиву не будет производиться. Если его значение отрицательно, он используется для смещения от конца массива для вычисления индекса fromIndex. Если вычисленный индекс меньше 0, будет производиться поиск по всему массиву.
При вызове метода indexOf
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если len равно 0, вернуть -1.
Если был передан аргумент fromIndex, пусть n будет ToInteger(fromIndex); иначе пусть n будет 0.
Если n ≥ len, вернуть -1.
Если n ≥ 0, то
Пусть k будет n.
Иначе, n<0
Пусть k будет len - abs(n).
Если k меньше чем 0, пусть k будет 0.
Повторить, пока k < len
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом ToString(k).
Если kPresent – true, то
Пусть elementK будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).
Пусть same будет результатом применения Алгоритма сравнения строгого равенства к searchElement и к elementK.
Если same равно true, вернуть k.
Увеличить k на 1.
Вернуть -1.
Свойство length
для метода indexOf
равно 1.
ПРИМЕЧАНИЕ Функция indexOf
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции indexOf
к объекту среды зависит от реализации.
Метод lastIndexOf
сравнивает searchElement с элементами массива в убывающем порядке, используя Алгоритм сравнения строгого равенства (11.9.6). Если сравниваемый элемент найден в одной или нескольких позициях, возвращает индекс последней позиции. В противном случае возвращает -1.
Значение по умолчанию второго необязательного аргумента fromIndex равно длине массива минус один (то есть, производится поиск по всему массиву). Если его значение больше или равно длине массива, будет производиться поиск по всему массиву. Если этот аргумент имеет отрицательное значение, оно используется для того, чтобы отступить от конца массива и получить индекс fromIndex. Если полученный индекс меньше 0, возвращается -1.
При вызове метода lastIndexOf
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если len равно 0, вернуть -1.
Если был передан аргумент fromIndex, пусть n будет ToInteger(fromIndex); иначе пусть n будет len.
Если n ≥ 0, пусть k будет min(n, len – 1).
Иначе, n < 0
Пусть k будет len - abs(n).
Повторить, пока k ≥ 0,
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом ToString(k).
Если kPresent – true, то
Пусть elementK будет результатом вызова внутреннего метода [[Get]] для O с аргументом ToString(k).
Пусть same будет результатом применения Алгоритма сравнения строгого равенства к searchElement и к elementK.
Если same равно true, вернуть k.
Уменьшить k на 1.
Вернуть -1.
Свойство length
для метода lastIndexOf
равно 1.
ПРИМЕЧАНИЕ Функция lastIndexOf
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции lastIndexOf
к объекту среды зависит от реализации.
Функция 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
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.
Пусть k будет 0.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть testResult будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.
Если ToBoolean(testResult) равно false, вернуть false.
Увеличить k на 1.
Вернуть true.
Свойство length
для метода every
равно 1.
ПРИМЕЧАНИЕ Функция every
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции every
к объекту среды зависит от реализации.
Функция 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
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.
Пусть k будет 0.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть testResult будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.
Если ToBoolean(testResult) равно true, вернуть true.
Увеличить k на 1.
Вернуть false.
Свойство length
для метода some
равно 1.
ПРИМЕЧАНИЕ Функция some
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции some
к объекту среды зависит от реализации.
Функция callbackfn – функция, принимающая три аргумента. Метод forEach
вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.
Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.
Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.
Метод forEach
не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.
Диапазон элементов, которые обрабатывает forEach
, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова forEach
. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callback, будет их значение в то время, как их посетит forEach
. Элементы, которые удаляются после начала вызова метода forEach
и перед их посещением, не будут посещены.
При вызове метода forEach
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.
Пусть k будет 0.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Вызвать внутренний метод [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.
Увеличить k на 1.
Вернуть undefined.
Свойство length
для метода forEach
равно 1.
ПРИМЕЧАНИЕ Функция forEach
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции forEach
к объекту среды зависит от реализации.
Функция callbackfn – функция, принимающая три аргумента. Метод map
вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, и создаёт новый объект Array из полученных результатов. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.
Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.
Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.
Метод map
не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.
Диапазон элементов, которые обрабатывает map
, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова map
. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит метод map
. Элементы, которые удаляются после начала вызова map
и перед их посещением, не будут посещены.
При вызове метода map
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.
Пусть A будет новым массивом, как если бы он был создан выражением new Array(
len)
, где Array
является стандартным встроенным конструктором с этим именем, а len – значение для len.
Пусть k будет 0.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть mappedValue будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами Pk, Property Descriptor {[[Value]]: mappedValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить k на 1.
Вернуть А.
Свойство length
для метода map
равно 1.
ПРИМЕЧАНИЕ Функция map
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции map
к объекту среды зависит от реализации.
Функция callbackfn – функция, принимающая три аргумента, и возвращающая значение, которое может быть приведено к булевому значению true или false. filter
вызывает функцию callbackfn по одному разу для каждого элемента, присутствующего в массиве, в возрастающем порядке, и создаёт новый массив из всех значений, для которых функция callbackfn возвращает значение true. Функция callbackfn вызывается только для фактически существующих элементов массива. Она не вызывается для отсутствующих элементов массива.
Если передаётся параметр thisArg, он будет использоваться в качестве значения this при каждом вызове функции callbackfn. Если этот параметр не передаётся, будет использоваться значение undefined.
Функция callbackfn вызывается с тремя аргументами: значение элемента, индекс элемента и проходимый объект.
filter
не видоизменяет напрямую объект, для которого он вызывается, но объект может быть видоизменён посредством вызовов функции callbackfn.
Диапазон элементов, которые обрабатывает filter
, устанавливается перед первым вызовом функции callbackfn. Функция callbackfn не будет посещать элементы, добавляемые к массиву после начала вызова filter
. Если существующие элементы массива изменяются, их значением, передаваемым в функцию callbackfn, будет их значение в то время, как их посетит filter
. Элементы, которые удаляются после начала вызова filter
и перед их посещением, не будут посещены.
При вызове метода filter
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если thisArg передавался, пусть T будет thisArg; иначе пусть T будет undefined.
Пусть A будет новым массивом, как если бы он был создан выражением new Array()
, где Array
является стандартным встроенным конструктором с этим именем.
Пусть k будет 0.
Пусть to будет 0.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть selected будет результатом вызова внутреннего метода [[Call]] для callbackfn с T в качестве значения this и списком аргументов, содержащим kValue, k и O.
Если ToBoolean(selected) – true, то
Вызвать внутренний метод [[DefineOwnProperty]] для A с аргументами ToString(to), Property Descriptor {[[Value]]: kValue, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true} и false.
Увеличить to на 1.
Увеличить k на 1.
Вернуть А.
Свойство length
для метода filter
равно 1.
ПРИМЕЧАНИЕ Функция filter
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции filter
к объекту среды зависит от реализации.
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
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если len равно 0, и при этом initialValue отсутствует, сгенерировать исключение TypeError.
Пусть k будет 0.
Если присутствует initialValue, то
Присвоить accumulator значение initialValue.
Иначе, initialValue отсутствует
Пусть kPresent будет false.
Повторить, пока kPresent равно false и k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть accumulator будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Увеличить k на 1.
Если kPresent равно false, сгенерировать исключение TypeError.
Повторить, пока k < len
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть accumulator будет результатом вызова внутреннего метода [[Call]] для callbackfn с undefined в качестве значения this и списком аргументов, содержащим accumulator, kValue, k и O.
Увеличить k на 1.
Вернуть accumulator.
Свойство length
для метода reduce
равно 1.
ПРИМЕЧАНИЕ Функция reduce
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reduce
к объекту среды зависит от реализации.
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
с одним или двумя аргументами выполняются следующие шаги:
Пусть O будет результатом вызова абстрактной операции ToObject с передачей значения this в качестве аргумента.
Пусть lenValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом "length"
.
Пусть len будет ToUint32(lenValue).
Если IsCallable(callbackfn) – false, сгенерировать исключение TypeError.
Если len равно 0, и при этом initialValue отсутствует, сгенерировать исключение TypeError.
Пусть k будет len-1.
Если присутствует initialValue, то
Присвоить accumulator значение initialValue.
Иначе, initialValue отсутствует
Пусть kPresent будет false.
Повторить, пока kPresent равно false и k ≥ 0
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть accumulator будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Уменьшить k на 1.
Если kPresent равно false, сгенерировать исключение TypeError.
Повторить, пока k ≥ 0
Пусть Pk будет ToString(k).
Пусть kPresent будет результатом вызова внутреннего метода [[HasProperty]] для O с аргументом Pk.
Если kPresent – true, то
Пусть kValue будет результатом вызова внутреннего метода [[Get]] для O с аргументом Pk.
Пусть accumulator будет результатом вызова внутреннего метода [[Call]] для callbackfn с undefined в качестве значения this и списком аргументов, содержащим accumulator, kValue, k и O.
Уменьшить k на 1.
Вернуть accumulator.
Свойство length
для метода reduceRight
равно 1.
ПРИМЕЧАНИЕ Функция reduceRight
является нарочито родовой функцией. Она не требует, чтобы её значение this было объектом Array. Поэтому она может передаваться другим типам объектов для использования в качестве метода. Возможность успешного применения функции reduceRight
к объекту среды зависит от реализации.
Экземпляры Array наследуют свойства объекта-прототипа Array. Значение их внутреннего свойства [[Class]] равно "Array"
. Кроме того, экземпляры Array обладают следующими свойствами:
Объекты Array используют разновидность внутреннего метода [[DefineOwnProperty]], используемую для других родных объектов ECMAScript (см. пункт 8.12.9).
Допустим, что A – объект Array, Desc – Дескриптор свойства, а Throw – булев флаг.
В приведенном ниже алгоритме термин “Отказать” Reject означает “Если Throw – true, то сгенерировать исключение TypeError, иначе вернуть false”.
При вызове внутреннего метода [[DefineOwnProperty]] объекта A со свойством P , дескриптором свойства Desc и булевым флагом Throw выполняются следующие шаги:
Пусть oldLenDesc – результат вызова внутреннего метода [[GetOwnProperty]] для A с передачей "length
" в качестве аргумента. Результат никогда не будет иметь значение undefined и не будет дескриптором аксессора, так как объекты Array создаются со свойством данных length, которое не может быть удалено или изменено.
Пусть oldLen будет oldLenDesc.[[Value]].
Если P равно "length
", то
Если поле [[Value]] для Desc отсутствует, то
Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length
", Desc и Throw .
Пусть newLenDesc будет копией Desc.
Пусть newLen будет ToUint32(Desc.[[Value]]).
Если newLen не равно ToNumber( Desc.[[Value]]), сгенерировать исключение RangeError.
Присвоить newLenDesc.[[Value] значение newLen.
Если newLen ≥oldLen, то
Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length
", newLenDesc и Throw .
Отказ, если oldLenDesc.[[Writable]] равно false.
Если newLenDesc.[[Writable]] отсутствует или имеет значение true, пусть newWritable будет true.
Иначе
Необходимо отложить присвоение атрибуту [[Writable]] значение false, если элементы не могут быть удалены.
Пусть newWritable будет false.
Присвоить newLenDesc.[[Writable] значение true.
Пусть succeeded будет результатом вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length
", newLenDesc и Throw .
Если succeeded равно false, вернуть false.
Пока newLen < oldLen повторить,
Присвоить oldLen значение oldLen – 1.
Пусть deleteSucceeded будет результатом вызова внутреннего метода [[Delete]] для A с передачей в качестве аргументов ToString(oldLen) и false.
Если deleteSucceeded равно false, то
Если newWritable равно false, то
Вызвать внутренний метод по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей "length
", Property Descriptor{[[Writable]]: false} и false в качестве аргументов. Этот вызов всегда будет возвращать значение true.
Вернуть true.
Иначе, если P – индекс массива (15.4), то
Пусть index будет ToUint32(P).
Отказ, если index ≥ oldLen и oldLenDesc.[[Writable]] равно false.
Пусть succeeded будет результатом вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов P, Desc и false.
Отказ, если succeeded равно false.
Если index ≥ oldLen
Присвоить oldLenDesc.[[Value]] значение index + 1.
Вызвать внутренний метод [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов "length
", oldLenDesc и false. Этот вызов всегда будет возвращать значение true.
Вернуть true.
Вернуть результат вызова внутреннего метода по умолчанию [[DefineOwnProperty]] (8.12.9) для A с передачей в качестве аргументов P, Desc и Throw.
Свойство length
данного объекта Array представляет собой свойство данных, значение которого всегда численно больше, чем имя каждого удаляемого свойства, имя которого является индексом массива.
Свойство length
изначально имеет атрибуты { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }.
ПРИМЕЧАНИЕ Попытка присвоить свойству length объекта Array значение, численно меньшее или равное самому большому числовому имени свойства неудаляемого индексированного свойства существующего массива приведёт к тому, что length будет иметь численное значение, на один больше, чем самое большое числовое имя свойства. См. 15.4.5.1.