JavaScript. Подробное руководство, 6-е издание, стр. 84

<b>var objects = [{х:1}, {у:2}, {z:3}];</b>

<b>var merged = objects.reduce(union); // =&gt; {x:1, y:2, z:3}</b>

Напомню, что, когда два объекта имеют свойства с одинаковыми именами, функция

<b>union()</b>
использует значение свойства второго аргумента, т.е.
<b>reduce()</b>
и
<b>reduceRight()</b>
могут давать разные результаты при использовании с функцией union():

<b>var objects = [{х:1,а:1}, {у:2,а:2}, {z:3,а:3}]:</b>

<b>var leftunion = objects.reduce(union); // {x:1, y:2, z:3. a:3}</b>

<b>var rightunion = objects.reduceRight(union); // {x:1, y:2, z:3, a:1}</b>

7.9.6. Методы indexOf() и lastlndexOf()

Методы

<b>indexOf()</b>
и
<b>lastlndexOf()</b>
отыскивают в массиве элемент с указанным значением и возвращают индекс первого найденного элемента или -1, если элемент с таким значением отсутствует. Метод
<b>indexOf()</b>
выполняет поиск от начала массива к концу, а метод
<b>lastlndexOf()</b>
- от конца к началу.

<b>а = [0.1,2.1,0];</b>

<b>a. indexOf(1) // =&gt; 1: а[1] = 1</b>

<b>a.lastlndexOf(1) // =&gt; 3: а[3] = 1 </b>

<b>a.index0f(3) // =&gt; -1: нет элемента со значением 3</b>

В отличие от других методов, описанных в этом разделе, методы

<b>indexOf()</b>
и
<b>lastlndexOf()</b>
не принимают функцию в виде аргумента. В первом аргументе им передается искомое значение. Второй аргумент является необязательным: он определяет индекс массива, с которого следует начинать поиск. Если опустить этот аргумент, метод
<b>indexOf()</b>
начнет поиск с начала массива, а метод
<b>lastlndexOf()</b>
- с конца. Во втором аргументе допускается передавать отрицательные значения, которые интерпретируются как смещение относительно конца массива, как в методе
<b>splice()</b>
: значение -1, например, соответствует последнему элементу массива.

Следующая функция отыскивает заданное значение в массиве и возвращает массив всех индексов, где было найдено совпадение. Здесь демонстрируется, как можно использовать второй аргумент метода

<b>indexOf()</b>
для поиска совпадений после первого.

<b>// Отыскивает все вхождения значения х в массив и возвращает </b>

<b>// массив индексов найденных совпадений </b>

<b>function findall(a. х) {</b>

<b>  var results = [], // Возвращаемый массив индексов</b>

<b>  len = a.length, // Длина массива, где выполняется поиск</b>

<b>  pos = 0; // Начальная позиция поиска</b>

<b>  while(pos &lt; len) { // Пока остались непроверенные элементы...</b>

<b>    pos = a.indexOf(x, pos); // Искать</b>

<b>    if (pos === -1) break; // Если ничего не найдено, поиск завершен.</b>

<b>    results.push(pos); // Иначе - сохранить индекс в массиве</b>

<b>    pos = pos +1; //И продолжить поиск со следующего элемента</b>

<b>  }</b>

<b>  return results; // Вернуть массив индексов</b>

<b>}</b>

Обратите внимание, что строки также имеют методы

<b>indexOf()</b>
и
<b>lastlndexOf(),</b>
которые действуют подобно методам массивов.

7.10. Тип Array

На протяжении этой главы мы не раз имели возможность убедиться, что массивы являются объектами, обладающими особыми чертами поведения. Получая неизвестный объект, иногда бывает полезно проверить, является он массивом или нет. Сделать это в реализации ECMAScript 5 можно с помощью функции Array. isArray():

<b>Array.isArray([]) // =&gt; true </b>

<b>Array.isArray({}) // =&gt; false</b>

Однако до выхода стандарта ECMAScript 5 отличить массивы от других объектов было удивительно сложно. Оператор

<b>typeof</b>
никак не помогает в этом: для массивов он возвращает строку "object" (и для всех других объектов, кроме функций). В простых случаях можно использовать оператор
<b>instanceof</b>
:

<b>[] instanceof Array // =&gt; true </b>

<b>({}) instanceof Array // =&gt; false</b>

Проблема применения оператора

<b>instanceof</b>
состоит в том, что в веб-броузерах может быть открыто несколько окон или фреймов. Каждое окно или фрейм имеет собственное окружение JavaScript, с собственным глобальным объектом. А каждый глобальный объект имеет собственное множество функций-конструкторов. Поэтому объект из одного фрейма никогда не будет определяться как экземпляр конструктора в другом фрейме. Даже при том, что путаница между фреймами возникает довольно редко, тем не менее этого вполне достаточно, чтобы считать оператор
<b>instanceof</b>
ненадежным средством определения принадлежности к массивам.

Решение заключается в том, чтобы выполнить проверку атрибута

<b>class</b>
(раздел 6.8.2) объекта. Для массивов этот атрибут всегда будет иметь значение «Array», благодаря чему в реализации ECMAScript 3 функцию
<b>isArray()</b>
можно определить так:

<b>var isArray = Function.isArray || function(o) { </b>

<b>  return typeof о === &quot;object&quot; &amp;&amp;</b>