Комбинированные операции присваивания
Под комбинированными операциями присваивания понимаются операции, совмещающие выполнение какой-либо определенной операции с одновременным присваиванием ее результата переменной, определяемой первым операндом.
Общий синтаксис подобных комбинированных операций следующий:
a OP= b,где OP заменяется на символ одной из рассмотренных ранее операций языка JavaScript.
Операция | Значение |
X *= Y | X = X * Y |
X /= Y | X = X / Y |
X += Y | X = X + Y |
X -= Y | X = X - Y |
X %= Y | X = X % Y |
X <<= Y | X = X << Y |
X >>= Y | X = X >> Y |
X >>>= Y | X = X >>> Y |
X &= Y | X = X & Y |
X ^= Y | X = X ^ Y |
X |= Y | X = X | Y |
Условная операция
Единственная операция в языке, требующая три операнда, причем первый операнд вычисляется в булевом контексте:
(условие) ? операнд2 : операнд3;Семантика ее такова: если значение первого операнда-условия истинно, то возвращается вычисленное значение второго операнда, иначе третьего.
Например, результатом выполнения следующего выражения будет присваивание переменной range строки "Пересдача", если значение переменной mark меньше или равно 2, в противном случае переменная range будет иметь значением строку "Зачтено":
range = (mark <= 2) ? "Пересдача" : "Зачтено";Приоритет операций
В приводимой ниже таблице перечислены все операции JavaScript в нисходящем порядке. Операции с одинаковым приоритетом выполняются в выражении слева направо.
Операции | Описание |
. [] () | Доступ к значению свойства объекта, вычисление индекса массива, вызов функции и группирование в выражении |
++ -- - ~ ! delete new typedef void | Унарные операции увеличения/уменьшения на единицу, вычисление числового содержимого с обратным знаком, побитовое инвертирование содержимого, логическое отрицание, удаление свойства объекта, создание объекта, получение типа данных, вычисление выражения, но возврат значения undefined |
* / % | Умножение, деление, остаток от деления |
+ - + | Сложение, вычитание и конкатенация |
<< >> >>> | Битовые сдвиги |
< <= > >= instanceof | Логические операции и операция проверки является ли данный объект экземпляром какого-либо объекта |
== != === !== | Логические операция сравнения на равенство и неравенство |
& | Побитовое AND |
^ | Побитовое XOR |
| | Побитовое OR |
&& | Логическое AND |
|| | Логическое OR |
?: | Условная операция |
= OP= | Присваивание и комбинированное присваивание |
, | Операция последовательного выполнения |
Упражнение 1. | |
Объявить в сценарии переменную var1 оператором var, не присваивая ей никакого значения, а переменную var2 не объявлять. Отобразить их содержимое функцией alert() и объяснить результаты. |
Упражнение 2. | |
Предложить способ сложения двух чисел, хранящихся в виде строковых литералов. Например, в выражении "2.1"+"3.0" будет выполнена операция конкатенации строк с результатом "2.13.0", а не сложение чисел, хранящихся в указанных строках. Задача состоит в том, чтобы получить число 5.1. |
Упражнение 3. | |
Можно ли в JavaScript определить, содержит ли переменная число или строку с литералом числа. Приведите, если это возможно, максимальное число способов проверки. |
Упражнение 4. | |
Чему будет равно значение переменной a после выполнения операторов: a) var a=""; a && (a=true); b) var a="javascript"; a && (a="vbscript"); a || (a="javascript"); c) var b="1.1"; a = typeof b*0.1; d) var b="1.1"; a = typeof(b*0.1); |
Операторы
Весь набор операторов языка можно разбить на три группы:
· операторы выбора, или условные;
· операторы цикла;
· операторы манипулирования с объектами.
Операторы выбора
Предназначены для организации ветвления в сценарии. Общий синтаксис следующий:
if(условие) { операторы1}[else { операторы2} ]Обратите внимание, что группы операторов блоков if и else заключены в фигурные скобки, которые можно опускать, если группа представлена одним оператором:
if(a == b) с = delse { с = ealert(c)}Семантика этого оператора такова: если проверяемое условие истинно, то выполняются операторы блока if, иначе блока else.
Операторы выбора могут быть вложенными друг в друга. В этом случае рекомендуется использовать фигурные скобки всегда во избежание ошибок при интерпретации подобных сложных операторов.
Если необходимо проверять одно и то же выражение на равенство разным значениям, то эффективнее использовать не группу вложенных операторов ветвления, а оператор switch со следующим синтаксисом:
switch (выражение){ case значение1 : [операторы1] [break;] case значение2 : [операторы2] [break;] ... [default :] [операторы]}Семантика его не отличается от подобных операторов в других языках программирования: выражение вычисляется и последовательно проверяется на равенство значениям, указанным в блоках case. Если равенство найдено, то выполняются операторы соответствующего блока case, если нет, то операторы блока default в случае его наличия.
Необязательный оператор break, задаваемый в каждом из блоков case выполняет безусловный выход из оператора switch. Если он не задан, то продолжается выполнение операторов и в следующих блоках case до первого оператора break или до конца тела оператора switch.
Операторы цикла
Основное предназначение оператора for организовать циклическое выполнение группы операторов, если заранее известно количество итераций:
for([инициал_выражение];[условие];[изменяющее_выражение]) { [операторы]}Инициализирующее выражение вычисляется один раз при входе в цикл. Изменяющее выражение предназначено для изменения значения переменной цикла, определяемой в инициализирующем выражении, и вычисляется каждый раз при переходе на очередную итерацию вместе с проверкой условия окончания выполнения цикла.
Переменная цикла не может быть создана локальной (даже если использовать в инициализирующем выражении оператор var) - она будет доступна и после завершения работы цикла:
for(var i=0; i < 10; i++){. . .};a[i] = value; // переменная i равна 10Если тело цикла состоит из одного оператора, то фигурные скобки, ограничивающее тело цикла, можно опустить.
Пример 1. Цикл for в сценарии JavaScript | ||||||||||||||
Создадим сценарий, который при загрузке документа вычисляет степени числа 2 и выводит в документ таблицу степеней двойки.
<html><head><script> document.write("<table border=1 cellspacing=0>" + "<tr><th>Степень</th><th>Результат</th></tr>") for(i=0; i<=5; i++){ document.write("<tr>", "<td align=center><p>2<sup>", i, "</sup></td>", "<td align=right>", Math.pow(2,i), "</td>", "</tr>") } document.write("</table>")</script></head><body></body></html> Результат работы этого сценария представлен ниже:
В сценарии используется метод write объекта document для формирования содержимого страницы. На каждой итерации цикла for формируется очередная строка таблицы, в первую ячейку которой заносится соответствующая степень двойки, а во вторую результат ее возведения в указанную степень. Для выполнения этого действия используется встроенный объект Math и его метод pow(), возводящий первый параметр в степень, заданную вторым параметром. Обратите внимание, что метод write может вызываться с любым количеством фактических параметров. Результатом его работы в любом случае является вывод в документ строки, полученной конкатенацией всех параметров, переданных в метод. |
Если количество итераций цикла заранее не известно, то в этом случае следует воспользоваться циклами while
while(условие) { [операторы]}или do
do { [операторы]} while (условие)Оба они выполняются пока истинно заданное в них условие. Отличие заключается в том, что цикл while является циклом с предусловием - сначала проверяется условие завершения цикла, а потом выполняется его тело, поэтому тело цикла может вообще не выполниться ни одного раза, если при входе в него условие ложно. Тогда как цикл do представляет собой цикл с постусловием - проверка завершения итераций выполняется после выполнения тела цикла, поэтому тело этого цикла всегда выполняется хотя бы один раз.
Для завершения этих циклов в теле каждого из них должна быть предусмотрена возможность изменения выражения-условия окончания цикла. Обычно это реализуется изменением значения какой-либо переменной, входящей в условие.
Пример 2. Перебор всех символов строки |
Мы используем цикл while для организации посимвольного перебора содержимого строковой переменной и отображения каждого символа на отдельной строке (вертикальное отображение содержимого строковой переменной): <script>s = "JavaScript";// Позиция первого символа в строкеi=0; // Цикл пока не дойдем до последнего символа строки swhile(ch = s.substr(i,1)) { // Отображение очередного символа document.write("<p><b>", ch, "</b></p>") // Вычисляем позицию следующего индекса i += 1} document.write("<p>Количество символов: <b>", i, "</b></p>")</script> В этом сценарии для получения очередного символа строки используется метод substr() объекта String, к которому автоматически преобразуется любая строка JavaScript. Метод выделяет из заданной строки подстроку, начиная с позиции, указанной первым параметром, и длиной, равной значению второго параметра. Если указанная начальная позиция превосходит позицию последнего символа строки, то метод возвращает пустую строку, которая в булевом контексте условия окончания цикла трактуется как ложь, что приводит к завершению выполнения цикла while. Позиция очередного символа исходной строки вычисляется увеличением на единицу переменной i. Таким образом, не зная количества символов в исходной строке, с помощью цикла while нам удалось перебрать и подсчитать все символы строки. Отметим, что можно было бы использовать для решения поставленной задачи и цикл for. Дело в том, что у каждой строки как объекта String есть свойство length, возвращающее количество ее символов, и это значение можно было бы использовать в качестве условия завершения цикла for. |
Иногда необходимо завершить цикл не по условию, задаваемому в заголовке цикла, а в результате вычисления некоторого условия в теле цикла. Для этой цели в JavaScript существуют операторы break и continue.
Оператор break завершает выполнение цикла и передает управление оператору, непосредственно следующим за оператором цикла. Оператор continue прекращает выполнение текущей итерации и начинает выполнение следующей, т.е. в цикле while он передает управление на проверку выражения условие цикла, а в цикле for - на вычисление выражения изменяющее_выражение.
Пример 3. Простая игра |
Создадим страницу HTML со сценарием игры в угадывание числа. При ее загрузке в бесконечном цикле do-while отображается диалоговое окно с полем ввода, в котором пользователь вводит какое-либо число. После нажатия кнопки OK сценарий проверяет, ввел ли пользователь число. Если да, то проверяется его равенство на "загаданное" число 30. В случае равенства операцией break осуществляется выход из бесконечного цикла, в противном случае операцией continue осуществляется переход на очередную итерацию. Пользователь в любой момент может прекратить выполнение сценария, нажав кнопку Отмена на диалоговом окне, или закрыв окно нажатием на кнопку с крестиком в правом верхнем углу. <script>var x = "";// Бесконечный циклdo{ // Отображение диалогового окна для ввода числа x = window.prompt("Какое мое любимое число?", x); // Завершил ли пользователь игру if (x == null) break; // Проверка ввода числа if (x = Number(x)){ if(x == 30) break; continue; } // Можно вводить только числа window.alert("Вводить можно только числа!"); } while (true) if (x == null) window.alert("Вы прекратили играть");else window.alert("Верно, мое любимое число "+x); </script> Для отображения диалогового окна используется метод prompt() объекта window, представляющего окно браузера. Этот объект является верхним объектом в иерархии объектов среды браузера. Первым параметром метода prompt() является строка подсказки, отображаемая на диалоговом окне, а вторым параметром значение по умолчанию, отображаемое в поле ввода этого окна. Метод при нажатии кнопки OK возвращает строку с содержимым поля ввода, а при нажатии кнопки Отмена или закрытия окна специальное значение null. Для проверки ввода числа используется конструктор числа Number(), возвращающий число, если его параметр является правильным числовым литералом или строкой, содержащей правильный числовой литерал. В противном случае он возвращает специальное значение NaN, в булевом контексте трактуемое как ложь. |
Упражнение 1. | |
Разработать документ HTML, который при его загрузке в браузер спрашивает пользователя коды символов кириллицы или латиницы он хочет отобразить. После чего отображает на странице таблицу соответствующих символов и их ASCII-кодов. Для получения ASCII-кода символа воспользуйтесь методом charCodeAt(index) строки, где параметр представляет позицию символа в строке. Создайте два сценария - один с циклом for, а другой с циклом while. |
Упражнение 2. | |
Разработайте документ, который при загрузке в браузер через диалоговое окно, отображаемое функцией prompt(), предоставляет пользователю возможность сформировать страницу HTML и отобразить ее. Предусмотрите два варианта работы сценария: введенный пользователем в диалоговом окне код HTML сразу же отображается в браузере и пользователь вводит постепенно весь код страницы, а потом страница отображается сразу же целиком. |
Функции
Функция - это именованная последовательность операторов, которая инициализируется и выполняется простой ссылкой на имя функции. Синтаксис задания функций в JavaScript следующий:
function имя_функции([формальные_параметры]) { [операторы] [return выражение]}Вызов в сценарии:
имя_функции(список_фактических_параметров)Во многих языках программирования можно указать при объявлении функции способ передачи в нее параметров - по ссылке или по значению. В первом случае передается ссылка на область памяти фактического параметра, что приводит к изменению его значения, если оно меняется в теле функции. Во втором случае в функцию передается копия значения фактического параметра, и его изменение в теле функции не приводит к изменению значения фактического параметра.
В JavaScript не предусмотрен механизм указания способа передачи параметров. Здесь используется заранее предопределенное правило для передачи параметров разных типов. Строки, целые, вещественные и булевы значения передаются по значению. Тогда как объекты и массивы передаются по ссылке.
Функция JavaScript всегда возвращает некоторое значение. Для явного указания возвращаемого значения используется операция return. Ее операнд определяет возвращаемое функцией значение. Если в теле функции явно не задается возвращаемое значение, то по умолчанию она возвращает значение undefined. Поэтому функцию JavaScript всегда можно использовать в выражениях.
Обычно все определения функций задаются в элементе SCRIPT заголовочной части документа HTML (элемент HEAD).
Функции JavaScript могут быть рекурсивными.
Пример 1. Рекурсивный вызов функции |
Реализуем сценарий вычисления факториала с использованием рекурсивного вызова функции. Это классический пример рекурсии, простой для ее понимания. Однако с точки зрения эффективности он не является наилучшим, так как факториал всегда можно вычислить, используя обычный цикл for. В нашем сценарии пользователь через диалоговое окно, отображаемое методом prompt() объекта window, передает целое число, факториал которого следует вычислить. Осуществляется проверка введенного числа и вызывается рекурсивная функция factorial(). Полный текст сценария приводится ниже: <script>// определение рекурсивной функции function factorial(n) { // база рекурсии (окончание ее) if ((n == 0) || (n == 1)) return 1 // рекурсивный вызов функции else return n * factorial(n-1)} x = window.prompt("Введите целое число","") if (x = Number(x)){ alert(factorial(x)) } else alert("Следует ввести целое число!") </script> Заметим, что наш сценарий не будет вычислять факториал любого числа. Во-первых, для чисел, больших 170, значением факториала будет число Infinity, так как для таких чисел факториал больше числа 1.7976931348623157*10308, а во-вторых, для чисел, больших 474, будет получена ошибка переполнения стека, используемого в любом языке программирования для хранения вызовов вложенных функций. |
Функции JavaScript позволяют вообще не задавать при их определении списка формальных параметров, а использовать в теле функции массив arguments, в котором хранятся все фактические параметры. Доступ к элементам массива осуществляется с помощью операции индексирования - квадратные скобки с заданным внутри них индексом элемента:
arguments[4]Индексы в массиве начинаются с нуля. Массивы в JavaScript являются объектами типа Array и у них есть свойство length, хранящее количество элементов массива. Таким образом, максимальный индекс элемента массива на единицу меньше значения его свойства length.
Механизм хранения переданных в функцию фактических параметров в массиве arguments позволяет создавать функции с заранее неизвестным числом параметров, т. е. в определении функции вообще можно не указывать формальные параметры, а работать в теле функции с массивом arguments. Можно часть параметров в определении указать, а остальные получать через этот массив.
Еще раз отметим, что в массиве arguments хранятся все фактически переданные параметры - и те, которые соответствуют явно определенным формальным параметрам, и те, которые переданы дополнительно при вызове функции в сценарии.
Пример 2. Получение значений фактических параметров функции |
Создадим функцию, возвращающую строку, в которой все переданные в нее фактические параметры, начиная со второго, разделены символом, заданным ее первым параметром: function myConcat(separator) { result="" // инициализация // итерации по всем переданным параметрам for (var i=1; i < arguments.length; i++) { result += arguments[i] + ((i == arguments.length-1) ? "" : separator) }return result} Теперь можно вызывать эту функцию с произвольным числом параметров. Например, следующий вызов myConcat(", ", "red", "orange", "blue") возвратит строку "red, orange, blue" Можно выполнить и такой вызов: myConcat(":", "red", "orange", "blue", "yellow") Результатом будет строка "red:orange:blue:yellow" |
1.4.18. Область видимости переменных
Любая переменная, объявленная вне тела функции оператором var или созданная по умолчанию в операции присваивания, является глобальной и видна везде в любой части любого сценария страницы и внутри тела любой функции. Время жизни такой глобальной переменной - пока страница отображается в браузере.
Переменная, объявленная с помощью оператора var в теле функции является локальной и видна только в теле той функции, где она объявлена. Ее время жизни - пока выполняется функция. Если в теле функции объявляется переменная по умолчанию в операции присваивания, то она будет иметь глобальную область видимости.
Локальная переменная может иметь имя, совпадающее с глобальной, однако при вызове функции они будут рассматриваться как две различные переменные:
aGlob = "g" // Глобальная переменнаяvar bGlob = "g" // Глобальная переменнаяfunction f(){ // изменение значения глобальной переменной aGlob = "f" // создание новой глобальной переменной aFuncGlob = "f" // создание локальной переменной var aFunc = "f" // создание локальной переменной с именем глобальной var bGlob = "f" }После вызова функции f() значения переменных будут следующими:
aGlob = "f"bGlob = "g"aFuncGlob = "f"Тогда как переменной aFunc существовать после завершения выполнения функции f() не будет.
При обработке сценария интерпретатор сначала находит в нем все переменные, определенные оператором var, создает их в зависимости от определенной для них области видимости и присваивает им значения undefined, а потом уже начинает выполнять сценарий, присваивая переменным значения, вычисляемые в соответствующих операторах присваивания. Если он встречает при интерпретации сценария переменную, не объявленную оператором var, то он немедленно создает глобальную переменную с указанным именем.
Пример 3. Область видимости переменных |
Поучительный пример на сказанное выше относительно создания интерпретатором переменных. Какое значение вернет функция tweak() и чему будет равно после ее выполнения значение переменной aNumber? var aNumber = 100;function tweak() { var newThing = 0; newThing = aNumber; aNumber = 42; if (newThing == 100){ var aNumber; aNumber = 123; newThing = aNumber; }return newThing}tweak(); На первый взгляд, все очевидно. При вызове функции tweak() уже существует глобальная переменная aNumber со значением 100. Функция создает локальную переменную newThing и присваивает ей значение 100 (значение глобальной переменной aNumber в момент вызова функции). После чего значение глобальной переменной aNumber меняется на 42. Выражение условия оператора if равно true и локальной переменной aNumber присваивается значение 123, которое в следующем операторе присваивается локальной переменной newThing и возвращается функцией tweak(). Итак, ответ таков: функция tweak() вернет значение 123, а после ее выполнение значение переменной aNumber будет равно 42. Выполним этот сценарий в браузере. Результат удивит нас весьма. Функция tweak() вернет значение undefined, а переменная aNumber как имела значение 100 до выполнения функции tweak(), так и будет его иметь! Почему? Пытаясь смоделировать выполнение программы, мы забыли, что интерпретатор до начала ее выполнения создает переменные, объявленные во всех операторах var, включая локальные переменные функций, и присваивая им значение undefined. Поэтому при входе в функцию tweak() доступа к глобальной переменной aNumber уже не будет, и первый оператор присваивания значения переменной newThing присвоит ей значение undefined. Теперь ясно, что блок оператора if выполняться не будет, и функция вернет значение undefined. По этой же причине не изменится и значение глобальной переменной aNumber, так как на самом деле значение 42 присваивается локальной переменной aNumber. |
Упражнение 1. | |
Разработать функцию пересчета давления из мм рт. ст. в Па и наоборот (760 мм рт. ст. соответствует 101325 Па) со следующей спецификацией: pressure(value, code), где value - значение либо в мм рт. ст., либо в Па, а code - код пересчета (0 из мм рт. ст. в Па, 1 из Па в мм рт. ст.). При щелчке пользователем на кнопке страницы ему предлагается в диалоговых окнах функции prompt() ввести код пересчета, начальное и конечное значения пересчитываемых величин и шаг. Сценарий должен отобразить на странице таблицу пересчета. |
Упражнение 2. | |
Разработать функцию вычисления среднего арифметического чисел, вводимых пользователем в диалоговых окнах функции prompt(), и отобразить в диалоговом окне функции alert() сами числа и их среднее арифметическое. Вызов сценария осуществить при щелчке на кнопке. |
Упражнение 3. | |
Разработать сценарий с двумя функциями, отображающими диалоговое окно alert() с сообщением, что вызвана такая-то функция, который также подсчитывает количество вызовов каждой функции. На странице предусмотреть две кнопки для вызова двух функций, а также две кнопки для отображения количества вызовов соответствующих функций. |
Встроенные объекты (1)
Язык JavaScript является объектно-ориентированным языком. Однако его объектная модель отличается от общеизвестных моделей таких языков программирования как Java и C++ тем, что в нем используется модель прототипов, а не классов. В языке JavaScript нет механизма классов, все объекты создаются на основе прототипа. Поэтому объектная модель JavaScript проще, но в связи с этим она и не столь мощна, как модели, основанные на классах. Здесь вы не найдете ни наследования, ни полиморфизма. В этом и следующем уроках мы остановимся на создании и работе со встроенными в JavaScript объектами, а в последнем уроке, завершающим часть I нашего курса, мы научим читателя создавать собственные пользовательские объекты.
Объект Array
Массив - упорядоченный набор однородных данных, к элементам которого можно обращаться по имени и индексу. В JavaScript, так как в нем отсутствует определение переменных определенного типа, это определение расширяется до хранения не обязательно однородных данных.
Любой объект в JavaScript создается конструктором этого объекта - специальной функцией, в которой определяются свойства и методы объекта. Для встроенных объектов конструкторы реализованы в виде функций, написанных на низкоуровневом языке процессора и встроенных в язык JavaScript. Для создания объекта необходимо выполнить операцию new с единственным операндом - конструктором этого объекта. Результатом выполнения этой операции будет выделение области оперативной памяти для хранения объекта, его инициализация и возврат ссылки на выделенную область памяти, которую можно сохранить в переменной для последующего обращения к объекту.. Все сказанное относится и к создаваемым пользователем объектам, но конструктор пишется на языке JavaScript с применением специальных правил создания свойств и методов объекта.
Массив, как и любой объект, создается с помощью операции new и своего конструктора - функции Array. Как и в других объектно-ориентированных языках, у объекта определенного типа может быть несколько конструкторов, отличающихся друг от друга только передаваемыми в него параметрами (имя всегда остается одно и то же):
a = new Array() // пустой массив (количество элементов 0)a = new Array(число) // массив с заданным числом элементовa = new Array(элемент0, элемент1, . . . , элементN);Количество элементов может быть равно максимальному значению 4-х байтного числа без знака.
Для получения значения элемента массива следует в квадратных скобках рядом с именем массива указать порядковый номер элемента (выполнить операцию индексацию []):
a[0] = "1"; a[1] = 2;c = b[2]*c[3];Нумерация элементов массива начинается с 0. При попытке получить значение элемента массива с несуществующим индексом никакой ошибки генерироваться не будет, а всегда будет возвращено значение undefined.
Методы объекта Array Методы | Действие |
concat([item1[, item2[, . . . [,itemN]]]]) | Возвращает массив, представляющий собой массив, метод которого вызывается, с добавленными в его конец элементами, заданными в качестве параметров. Если параметр сам является массивом, то добавляются все его элементы. Сам массив не изменяется. |
join(separator) | Возвращает строку - результат конкатенации всех элементов массива. Соседние элементы в строке разделены указанным в качестве параметра разделителем separator. |
pop() | Удаляет последний элемент из массива и возвращает его значение. |
push([item1[, item2[, . . . [,itemN]]]]) | Добавляет элементы в конец массива и возвращает последний добавленный элемент. Если добавляемый элемент массив, то добавляет его как один элемент. |
reverse() | Переставляет элементы массива в обратном порядке: первый элемент становится последним, а последний первым. |
shift() | Удаляет первый элемент массива и возвращает его значение. |
slice(start [, end]) | Возвращает массив, содержащий часть исходного массива (сечение). Если параметр end не определен, то возвращаются все элементы от элемента с индексом start до конца массива. |
splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]]) | Удаляет заданное вторым параметром deleteCount количество элементов из массива, начиная с элемента с индексом start. Если заданы необязательные параметры item, то добавляет их вместо удаленных. Возвращает массив удаленных элементов. |
sort([имя_функции]) | Возвращает массив, элементы которого отсортированы заданным в функции методом. Если метод сортировки вызывается без параметра, то элементы сортируются по порядку возрастания номеров начальных символов в таблице ASCII. Если при вызове метода параметром указывается ссылка на функцию сортировки задана, то она должна быть написана в соответствии со следующей спецификацией: она имеет два обязательных параметра и возвращает отрицательное значение, если значение первого параметра меньше значения второго, ноль, если они равны и положительное значение, если значение первого параметра превосходит значение второго. |
unshift([item1[, item2[, . . . [,itemN]]]]) | Добавляет один или более элементов в начало массива и возвращает новую длину массива. |
toString() | Возвращает строку - результат конкатенации всех элементов массива. Элементы массива в строке разделены запятой ,. |
Несколько примеров использования методов объекта массив. Пусть определены два массива:
array1 = new Array("Первый","Второй","Третий");array2 = new Array("Один","Два","Три");Тогда метод join() первого массива array1.join() возвратит строку:
"Первый,Второй,Третий"А его же метод array1.join(":") возвратит следующую строку:
"Первый:Второй:Третий"Заметим, что метод toString() массива (наследуется от встроенного объекта Object и переопределяется в конструкторе String()) , вызываемый по умолчанию тогда, когда надо представить объект-массив в виде строки, по-существу вызывает его метод join() без параметра. Например, если необходимо отобразить в документе содержимое массива, то можно использовать следующий оператор:
document.write("<p>", array1, "</p>");Результатом будет новый абзац со значениями массива array1, разделенными запятыми:
Первый,Второй,ТретийМетод sort() первого массива array1.sort() упорядочит элементы массива array1 (переставив их местами непосредственно в самом массиве array1) в алфавитном порядке:
array1[0] = "Второй"array1[1] = "Первый"array1[2] = "Третий"Для сортировки массива в обратном порядке следует написать собственную функцию сортировки и передать ее имя (ссылку на нее) в метод sort() массива:
function revSort(a,b){ return (a > b) ? -1 : 1}Теперь вызов, например, array2.sort(revSort), отсортирует элементы массива array2 в противоположно-алфавитном порядке:
array2[0] = "Три"array2[1] = "Один"array2[2] = "Два"Коль скоро некоторые методы массива возвращают массив, то к нему можно сразу же применить какой-либо метод, продолжив "точечную" нотацию. Например, array1.concat(array2).sort() объединит два массива в один новый и отсортирует его.
Массив, как объект, имеет свойство length, хранящее количество элементов массива. Добавление или удаление элементов массива (методы pop, push, shift, unshift, splice) приводит к автоматическому изменению свойства length.
Добавить в конец массива элемент можно не только с помощью методов push или splice, но и простым заданием элемента с индексом, большим индекса его последнего элемента. При этом все промежуточные элементы принимают значения undefined.
Массивы JavaScript "понимают" не только целые числовые индексы, но и индексы, заданные в виде строки. Однако следует иметь в виду, что добавление в массив элементов со строковыми индексами не приводит к увеличению значения свойства length, а это означает, что подобные "элементы" не участвуют ни в каких методах массива. Забегая вперед, поясним, что созданием элемента со строковым индексом мы на самом деле создаем новое свойство нашего конкретного объекта-массива.
Для массивов нескольких размерностей конструктор не предусмотрен. Но их можно создавать, объявляя каждый элемент одномерного массива снова одномерным массивом. Полученные элементы уже двумерного массива можно снова объявить как одномерные массивы, создав, таким образом, трехмерный массив и т. д. Следующий код создает двумерный массив размерности (4 4):
a = new Array()for (i=0; i < 4; i++) { a[i] = new Array() for (j=0; j < 4; j++) { a[i][j] = значение }}Обратите внимание, что при ссылке на элементы такого массива индекс каждого размерения элемента следует задавать в самостоятельных квадратных скобках: сначала в квадратных скобках указать первый индекс, затем в других квадратных скобках второй индекс и т. д.
Объект Date
В JavaScript дата хранится в виде количества миллисекунд, прошедших от 1 января 1970 года. Диапазон хранимых дат от 250 000 до РХ до 255 000 по РХ.
Для создания объекта даты используется конструктор Date() с различными параметрами:
имя_объекта = new Date([параметры]);Если в конструкторе параметры отсутствуют, то значением объекта будет текущая дата:
today = new Date()Параметром конструктора может быть строка вида:
"месяц день, год часы:минуты:секунды"Если при этом опустить значения часов, минут и секунд, то по умолчанию они будут иметь значения 0. Месяц следует задавать в английском правописании, сокращая до трех букв, причем первую букву слова не обязательно задавать прописной:
Xmas = new Date("January 7, 2004 00:00:00")Xmas = new Date("Jan 7, 2004 00:00:00")Xmas = new Date("jan 7, 2004 00:00:00")В конструкторе можно задать список параметров, определяющих год, месяц и день с необязательными часами, минутами и секундами (отсчет месяцев начинается с 0 - январь):
Xmas = new Date(2004, 0, 7)Xmas = new Date(2004, 0, 7, 0)
В приводимой ниже таблицы представлены форматы отображения даты некоторыми методами объекта Date:
Метод | Результат |
toString() | Sun Sep 14 21:35:08 UTC+0400 2003 |
toLocaleString() | воскресенье, 14 сентября 2003 г. 21:35:08 |
toGMTString() | Sun, 14 Sep 2003 17:35:08 UTC |
toUTCString() | Sun, 14 Sep 2003 17:35:08 UTC |
toDateString() | Sun Sep 14 2003 |
toLocaleDateString() | воскресенье, 14 сентября 2003 г. |
toTimeString() | 21:35:08 UTC+0400 |
toLocaleTimeString() | 21:35:08 |
Дата добавления: 2016-02-11; просмотров: 1648;