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

<b>Array.prototype.join.call(a, &quot;+&quot;) // =&gt; &quot;a+b+c&quot;</b>

<b>Array.prototype.slice.call(a, 0) // =&gt; [&quot;a&quot;.&quot;b&quot;,&quot;с&quot;]: копия, настоящий массив</b>

<b>Array.prototype.map.call(a, function(x) { return x.toUpperCase();</b>
<b>}) // =&gt; [&quot;А&quot;,&quot;В&quot;,&quot;C&quot;]:</b>

Мы уже встречались с таким использованием метода

<b>саll()</b>
в разделе 7.10, где описывался метод
<b>isArray()</b>
. Метод
<b>саll()</b>
объектов класса
<b>Function</b>
детально рассматривается в разделе 8.7.3.

Методы массивов, определяемые в ECMAScript 5, были введены в Firefox 1.5. Поскольку они имели универсальную реализацию, в Firefox также были введены версии этих методов в виде функций, объявленных непосредственно в конструкторе

<b>Array</b>
. Если использовать эти версии методов, примеры выше можно переписать так:

<b>var а = {&quot;О&quot;:&quot;а&quot;, &quot;1&quot;:&quot;Ь&quot;, &quot;2&quot;:&quot;с&quot;, length;3}; // Объект, подобный массиву </b>

<b>Array.join(a, &quot;+&quot;)</b>

<b>Array.slice(a, 0)</b>

<b>Array.map(a, function(x) { return x.toUpperCase(); })</b>

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

<b>Array.join = Array.join || function(a,sep) { </b>

<b>  return Array.prototype.join.call(a,sep);</b>

<b>};</b>

<b>Array.slice = Array.slice || function(a,from,to) {</b>

<b>  return Array.prototype.slice.call(a,from,to);</b>

<b>};</b>

<b>Array.map = Array.map || function(a, f, thisArg) {</b>

<b>  return Array.prototype.map.call(a, f, thisArg);</b>

<b>}</b>

7.12. Строки как массивы

В ECMAScript 5 (и во многих последних версиях броузеров, включая IE8, появившихся до выхода стандарта ECMAScript 5) строки своим поведением напоминают массивы, доступные только для чтения. Вместо метода

<b>charAt()</b>
для обращения к отдельным символам можно использовать квадратные скобки:

<b>var s = test;</b>

<b>s.charAt(0) // =&gt; &quot;t&quot;</b>

<b>s[1] // =&gt; &quot;e&quot;</b>

Оператор

<b>typeof</b>
для строк все так же возвращает «string», а если строку передать методу
<b>Array.isArray()</b>
, он вернет
<b>false</b>
.

Основное преимущество, которое дает поддержка индексирования строк, - это возможность заменить вызов метода

<b>charAt()</b>
квадратными скобками и получить более краткий, удобочитаемый и, возможно, более эффективный программный код. Однако тот факт, что строки своим поведением напоминают массивы, означает также, что к ним могут применяться универсальные методы массивов. Например:

<b>s = &quot;JavaScript&quot;</b>

<b>Array.prototype.join.call(s, &quot; &quot;) // =&gt; &quot;J a v a S с r і p t&quot;</b>

<b>Array.prototype.filter.call(s, // Фильтровать символы строки</b>

<b>  function(x) {</b>

<b>    return x.match(/[~aeiou]/); // Совпадение только с согласными </b>

<b>  }).join(&quot;&quot;) // =&gt; &quot;JvScrpt&quot;</b>

Имейте в виду, что строки являются неизменяемыми значениями, поэтому при работе с ними как с массивами их следует интерпретировать как массивы, доступные только для чтения. Такие методы массивов, как

<b>push(), sort(), reverse()</b>
и
<b>splice(),</b>
изменяют исходный массив и не будут работать со строками. Однако попытка изменить строку с помощью метода массива не вызовет ошибку: строка просто не изменится.

8

Функции

Функция - это блок программного кода на языке JavaScript, который определяется один раз и может выполняться, или вызываться, многократно. Возможно, вы уже знакомы с понятием «функция» под другим названием, таким как подпрограмма, или процедура. Функции могут иметь параметры: определение функции может включать список идентификаторов, которые называются параметрами и играют роль локальных переменных в теле функции. При вызове функций им могут передаваться значения, или аргументы, соответствующие их параметрам. Функции часто используют свои аргументы для вычисления возвращаемого значения, которое является значением выражения вызова функции. В дополнение к аргументам при вызове любой функции ей передается еще одно значение, определяющее контекст вызова - значение в ключевом слове

<b>this</b>
.

Если функция присваивается свойству объекта, она называется методом объекта. Когда функция вызывается посредством объекта, этот объект становится контекстом вызова, или значением ключевого слова

<b>this</b>
. Функции, предназначенные для инициализации вновь созданных объектов, называются конструкторами. Конструкторы были описаны в разделе 6.1, и мы вернемся к ним в главе 9.

Функции в языке JavaScript являются объектами и могут использоваться разными способами. Например, функции могут присваиваться переменным и передаваться другим функциям. Поскольку функции являются объектами, имеется возможность присваивать значения их свойствам и даже вызывать их методы.

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