§13. Специальные значения. Числа и строки как объекты.
Значение undefined.
В JavaScript существует специальное значение, которое присваивается любой переменной в том случае, если её значение не определено. Например, мы можем просто создать переменную, не присваивая ей значения. В таком случае ей автоматически присваивается значение undefined. Пример:
<script>
var x;
document.write(x);
</script>
Максимально и минимально возможные значения чисел в JavaScript.
Любая переменная типа число может принимать значения в диапазоне от минимально возможного до максимально возможного. Связано это с тем, что для её хранения выделяется строго определённое количество бит.
Бит – это элементарная ячейка памяти, которая может принимать значение 1 или 0. Соответственно в одном бите мы можем хранить числа от нуля до одного. Если возьмём два бита, то уже сможем хранить числа от 0 до 3. И т.д.
В JavaScript переменные типа число занимают 64 бита, при этом они разделены на группы, каждая из которых имеет своё особое назначение. Поэтому в этих 64 битах можно хранить числа от (максимально возможное значение) до (минимально возможное значение).
По приближению к нулю так же есть ограничение. Число не может быть ближе к нулю чем .
Специальные числовые значения.
В особых случаях числовым переменным можно присваивать специальные числовые значения.
Infinity – бесконечность. Присваивается переменной в том случае если число становится больше максимально возможного значения. Пример:
var num = 1.7976931348623157E308;
document.write(num,'<br>');
num = num+0.0000000000000001E308;
document.write(num);
-Infinity – минус бесконечность. Присваивается переменной в том случае, если значение становится меньше наименьшего возможного:
var num = -1.7976931348623157E308;
document.write(num,'<br>');
num = num-1E308;
document.write(num);
NaN – нечисло. Присваивается тогда, когда математическая операция не может быть выполнена:
document.write(0/0,'<br>');
document.write('Строка'*2,'<br>');
Числа как объекты.
Числа в JavaScript можно воспринимать как объекты. Соответственно у переменной типа число есть свойства и методы, которые приведены далее:
toExponential(x) – переводит число в строку в экспоненциальном виде. Экспоненциальный вид означает, что до точки должен быть один знак. Само число при этом должно быть умножено на 10 в нужной степени. Аргумент х – число знаков после точки. Если он не указан, то число выберется автоматически. Число знаков x должно находиться в диапазоне от 0 до 20. Пример:
var r = 0.01/3;
var s = r.toExponential(3);
document.write('0.01/3 в обычном виде:',r,'<br>');
document.write('0.01/3 в експоненциальном виде:',s);
toFixed(x) – возвращает строку в не экспоненциальном виде. Аргумент x – число знаков после точки. Если x не указано, то число округляется до ближайшего целого. Пример:
var r = 100/3;
document.write('r = ',r,'<br>');
var s = r.toFixed(3);
document.write('r.toFixed(3) = ',s,'<br>');
s = r.toFixed();
document.write('r.toFixed() = ',s);
toLocaleString – преобразует число в строку в соответствии с региональными настройками компьютера.
<script>
var r = 10/3;
document.write('r = ',r,'<br>');
document.write('r.toLocaleString() = ',r.toLocaleString(),'<br>');
</script>
Обратите внимание, что при простом выводе числа используется точка, а при использовании метода toLocaleString – запятая, так же количество знаков после точки (запятой) – разное.
toPrecision(x) – округляет число по количеству значащих цифр равному x. x – целое число от 1 до 21. Изучите пример, думаю будет понятно, как метод работает:
<script>
var r = 123456.789;
document.write('r = ',r,'<br>');
document.write('r.toPrecision(7) = ',r.toPrecision(7),'<br>');
document.write('r.toPrecision(3) = ',r.toPrecision(3),'<br>');
</script>
toString(x) – преобразует число в строку в соответствии с системой счисления переданной в качестве аргумента. Если x = 10 или аргумент отсутствует, то число преобразуется в десятичной системе счисления. Пример:
<script>
var r = 252;
document.write('r = ',r,'<br>');
document.write('r.toString() = ',r.toString(),'<br>');
document.write('r.toPrecision(16) = ',r.toString(16),'<br>');
</script>
valueOf – возвращает числовое значение. В явном вызове этого метода, как правило, не возникает необходимости. Пример:
<script>
var r = 252.12;
document.write('r.valueOf() = ',r.valueOf(),'<br>');
</script>
Объект Number.
Плюсом ко всему в базовом JavaScript есть объект Number, свойства которого приведены далее в примере, и которыми можно пользоваться:
<script>
document.write('Number.MAX_VALUE = ',Number.MAX_VALUE,'<br>');
var r = Number.MIN_VALUE;
document.write('Number.MIN_VALUE = ',r.toExponential(16),'<br>');
document.write('Number.NEGATIVE_INFINITY = ',Number.NEGATIVE_INFINITY,'<br>');
document.write('Number.POSITIVE_INFINITY = ',Number.POSITIVE_INFINITY,'<br>');
document.write('Number.NaN = ',Number.NaN);
</script>
Конструктор Number.
Как было сказано, переменная типа число может восприниматься как объект, поэтому есть и конструктор Number, который создаёт объекты типа число. Пример:
<script>
var r = new Number(252.12);
document.write('r = ',r,'<br>');
</script>
Строка как массив символов.
Каждая строка в JavaScript, как и в других языках, является массивом символов. Поэтому доступ к каждому отдельному символу в строке может быть осуществлён так же как к элементу массива. Причём первый символ так же имеет порядковый индекс 0. Пример:
<script>
var s = 'Привет всем!';
for (var i = 0; i < 12; i++) document.write(s[i]);
</script>
Примечание: т.к., по приведённому выше материалу, трудно придумать какие либо интересные задания, то с ним вы должны просто ознакомиться и применять в своей практике.
В дальнейшем вам придётся изучать множество информации самостоятельно, поэтому следующий материал будет дан без примеров, а в задачах будет предложено придумать их самостоятельно. Если возникнут затруднения, то обратитесь к готовым решениям.
Строки как объекты.
Так же как и числа, переменные типа строка могут восприниматься как объекты. В таком виде становятся доступными свойство length и ряд методов. Далее в таблице они все представлены.
Свойство/метод | Описание |
length | Свойство, содержащее в себе количество символов в строке. |
charAt(i) | Возвращает символ из строки в позиции i. |
charCodeAt(i) | Возвращает код символа из строки в позиции i. |
concat(s,t,u...) | Возвращает строку соединённую с аргументами. |
indexOf(str,i) | Производит поиск строки str с позиции i. Если i не указан, то str ищется с начала. Если str найдена, то indexOf возвращает её позицию, если нет, то возвращает -1. |
localeCompare(str) | Сравнивает строку со строкой str, с учётом нюансов алфавитов различных стран. Если строка меньше str, то возвращает отрицательное число, и наоборот. Для сортировки слов, рекомендуется именно этот метод. |
slice(i_1,i_2) | Возвращает подстроку, начинающуюся с позиции i_1, и заканчивающуюся позицией i_2. i_1 и i_2 могут быть отрицательными. В этом случае они указывают позицию с конца. |
split(str_split,lim) | Делит строку на подстроки в тех местах, где встречается str_split. lim – количество символов от начала строки, которое нужно разделить. Если lim не указан, то делится вся строка. Метод split возвращает массив получившихся подстрок. Для примера, если указать в качестве str_split пробел, то метод возвратит массив слов из этой строки. |
substr(i,count) | Возвращает подстроку из count символов, начиная с позиции i. Если i отрицателен, то позиция отсчитывается с конца строки. |
toLowerCase() | Возвращает строку, где все символы становятся в нижнем регистре. |
toString() | Возвращает строку. Явный вызов метода практически не используется. |
toUpperCase() | Возвращает строку, где все символы становятся в верхнем регистре. |
valueOf() | Возвращает строку. Явный вызов метода практически не используется. |
toLocaleLowerCase() | Возвращает строку, где все символы становятся в нижнем регистре с учётом особенностей национальных алфавитов. |
toLocaleUpperCase() | Возвращает строку, где все символы становятся в верхнем регистре с учётом особенностей национальных алфавитов. |
Примечание: переменные типа массив так же можно воспринимать как объекты. В таком виде программисту доступны ряд свойств и методов, которые будут изучены в следующем параграфе. Сейчас при решении задач вам понадобится свойство length, которое есть у любого массива, и которое содержит количество элементов массива.
Метод String.fromCharCode().
Для работы со строками существует отдельный метод String.fromCharCode(c_1,c_2,c_3...), который возвращает строку из символов, коды которых переданы в качестве аргументов.
Примечание: данный метод является статическим, и вызываться он должен именно в виде String.fromCarCode(). О том, что такое статические методы речь будет ид позже.
Литералы как объекты.
Под словом литерал в данном случае будем понимать непосредственно число или строку в тексте кода. Литералы в JavaScript тоже являются объектами, и у них есть такие же свойства и методы, как вышеприведённые свойства и методы чисел и строк. Доступ к ним осуществляется так же через точку. Для примера, если мы захотим узнать длину слова «Привет», то нам не нужно создавать дополнительной переменной:
var wordLength = 'Привет'.length;//count = 6
Задачи.
1. Изучить таблицу со свойством и методами строк. Придумать и реализовать примеры их использования.
2. Создать функцию, находящую и выделяющую слово в тексте, сколько бы раз оно не встречалось. Создать пример её использования.
3. Создать страницу с кодом программы. С помощью JavaScript выделить слова различным цветом в зависимости от назначения, так же как они выделены в редакторе кода, например в Notepad++.
Примеры решений.
1.
<script>
var s = 'Привет всем!';
//Свойство length
document.write('<h4>Свойство length</h4><b>Код:</b><br><code>');
document.write('for (var i = 0; i < s.length; i++) document.write(s[i]);');
document.write('</code><br><b>Результат:</b><br>');
for (var i = 0; i < s.length; i++) document.write(s[i]);
document.write('<hr>');
//Метод charAt(i)
document.write('<h4>Метод charAt(i)</h4><b>Код:</b><br><code>');
document.write('for (var i = 0; i < s.length; i++) document.write(s.charAt(i));');
document.write('</code><br><b>Результат:</b><br>');
for (var i = 0; i < s.length; i++) document.write(s.charAt(i));
document.write('<hr>');
//Метод charCodeAt(i)
document.write('<h4>Метод charCodeAt(i)</h4><b>Код:</b><br><code>');
document.write('for (var i = 0; i < s.length; i++) document.write(s.charCodeAt(i));');
document.write('</code><br><b>Результат:</b><br>');
for (var i = 0; i < s.length; i++) document.write(s.charCodeAt(i));
document.write('<hr>');
//Метод concat(i)
document.write('<h4>Метод concat(i)</h4><b>Код:</b><br><code>');
document.write("var str = s.concat(' Здравстуйте,',' дорогие друзья!','<br>');");
document.write('<br>');
document.write('document.write(str);');
document.write('</code><br><b>Результат:</b><br>');
var str = s.concat(' Здравстуйте,',' дорогие друзья!','<br>');
document.write(str);
document.write('<hr>');
//Метод indexOf(str,i)
document.write('<h4>Метод indexOf(str,i)</h4><b>Код:</b><br><code>');
document.write("var n = str.indexOf('дорогие');");
document.write('<br>');
document.write('if (n == -1)');
document.write('<br>');
document.write("  document.write('Строка ",'"дорогие"'," не найдена')");
document.write('<br>');
document.write('else');
document.write('<br>');
document.write("  document.write('Строка ",'"дорогие"'," начинается с позиции ',n);");
document.write('</code><br><b>Результат:</b><br>');
var n = str.indexOf('дорогие');
if (n == -1)
document.write('Строка "дорогие" не найдена')
else
document.write('Строка "дорогие" начинается с позиции ',n);
document.write('<hr>');
//Метод localeCompare(str)
document.write('<h4>Метод localeCompare(str)</h4><b>Код:</b><br><code>');
document.write("if ('Петя'.localeCompare('Саша')<0)");
document.write('<br>');
document.write("  document.write('Петя < Саша')");
document.write('<br>');
document.write("else");
document.write('<br>');
document.write("  document.write('Петя > Саша');");
document.write('</code><br><b>Результат:</b><br>');
if ('Петя'.localeCompare('Саша')<0)
document.write('Петя < Саша')
else
document.write('Петя > Саша');
document.write('<hr>');
//Методы slice(i_1,i_2) substr(i,count)
document.write('<h4>Методы slice(i_1,i_2) substr(i,count)</h4><b>Код:</b><br><code>');
document.write("var sS = 'дорогие';");
document.write('<br>');
document.write("var sTemp = str.slice(str.indexOf(sS),str.indexOf(sS)+sS.length);");
document.write('<br>');
document.write("document.write(sTemp,'<br>');");
document.write('<br>');
document.write("sTemp = str.substr(str.indexOf(sS),sS.length);");
document.write('<br>');
document.write("document.write(sTemp);");
document.write('</code><br><b>Результат:</b><br>');
var sS = 'дорогие';
var sTemp = str.slice(str.indexOf(sS),str.indexOf(sS)+sS.length);
document.write(sTemp,'<br>');
sTemp = str.substr(str.indexOf(sS),sS.length);
document.write(sTemp);
document.write('<hr>');
//Метод split(str_split,lim)
document.write('<h4>Метод split(str_split,lim)</h4><b>Код:</b><br><code>');
document.write("var m = str.split(' ');");
document.write('<br>');
document.write("for (var i = 0;i<m.length;i++) document.write(m[i],'<br>');");
document.write('</code><br><b>Результат:</b><br>');
var m = str.split(' ');
for (var i = 0;i<m.length;i++) document.write(m[i],'<br>');
document.write('<hr>');
//Методы toLowerCase() toUpperCase()
//toLocaleLowerCase() toLocaleUpperCase()
document.write('<h4>Методы toLowerCase() toUpperCase() ',
'toLocaleLowerCase() toLocaleUpperCase() </h4><b>Код:</b><br><code>');
document.write('document.write(str.toLowerCase());','<br>');
document.write('document.write(str.toUpperCase());','<br>');
document.write('document.write(str.toLocaleLowerCase());','<br>');
document.write('document.write(str.toLocaleUpperCase());','<br>');
document.write('</code><br><b>Результат:</b><br>');
document.write(str.toLowerCase());
document.write(str.toUpperCase());
document.write(str.toLocaleLowerCase());
document.write(str.toLocaleUpperCase());
</script>
Свойство length
Код:
for (var i = 0; i < s.length; i++) document.write(s[i]);
Результат:
Привет всем!
Метод charAt(i)
Код:
for (var i = 0; i < s.length; i++) document.write(s.charAt(i));
Результат:
Привет всем!
Метод charCodeAt(i)
Код:
for (var i = 0; i < s.length; i++) document.write(s.charCodeAt(i));
Результат:
10551088108010741077109032107410891077108433
Метод concat(i)
Код:
var str = s.concat(' Здравстуйте,',' дорогие друзья!','<br>');
document.write(str);
Результат:
Привет всем! Здравстуйте, дорогие друзья!
Метод indexOf(str,i)
Код:
var n = str.indexOf('дорогие');
if (n == -1)
document.write('Строка "дорогие" не найдена')
else
document.write('Строка "дорогие" начинается с позиции ',n);
Результат:
Строка "дорогие" начинается с позиции 26
Метод localeCompare(str)
Код:
if ('Петя'.localeCompare('Саша')<0)
document.write('Петя < Саша')
else
document.write('Петя > Саша');
Результат:
Петя < Саша
Методы slice(i_1,i_2) substr(i,count)
Код:
var sS = 'дорогие';
var sTemp = str.slice(str.indexOf(sS),str.indexOf(sS)+sS.length);
document.write(sTemp,'<br>');
sTemp = str.substr(str.indexOf(sS),sS.length);
document.write(sTemp);
Результат:
дорогие
дорогие
Метод split(str_split,lim)
Код:
var m = str.split(' ');
for (var i = 0;i<m.length;i++) document.write(m[i],'<br>');
Результат:
Привет
всем!
Здравстуйте,
дорогие
друзья!
Методы toLowerCase() toUpperCase() toLocaleLowerCase() toLocaleUpperCase()
Код:
document.write(str.toLowerCase());
document.write(str.toUpperCase());
document.write(str.toLocaleLowerCase());
document.write(str.toLocaleUpperCase());
Результат:
привет всем! здравстуйте, дорогие друзья!
ПРИВЕТ ВСЕМ! ЗДРАВСТУЙТЕ, ДОРОГИЕ ДРУЗЬЯ!
привет всем! здравстуйте, дорогие друзья!
ПРИВЕТ ВСЕМ! ЗДРАВСТУЙТЕ, ДОРОГИЕ ДРУЗЬЯ!
2.
<body>
<div id = "text">Привет товарищи! Привет друзья! Привет все!</div>
<script>
function searchWord(s)
{
alert('Сейчас будет выделено слово '+s);
var s1 = '<span style = "background-color:yellow;">';
var s2 = '</span>';
var sTemp = text.innerHTML;
var mTemp = sTemp.split(s);
sTemp = '';
for (var i = 0; i<mTemp.length-1; i++) sTemp = sTemp + mTemp[i] + s1 + s + s2;
sTemp = sTemp + mTemp[mTemp.length-1];
text.innerHTML = sTemp;
}
searchWord('Привет');
</script>
</body>