Глобальный объект в JavaScript

Глобальным называется объект, который является общим для всего скрипта. Все переменные и функции, созданные в общем потоке программы (т.е. не заданы локально для функций), называются глобальными. Они являются свойствами и методами глобального объекта. Общий поток программы называется глобальной областью видимости.

Объект window

Все интернет-браузеры имеют объект window, который представляет набор свойств для работы с окном браузера. Например, функции alert(), confirm() и prompt() являются методами объекта window для работы с окном. В то же время window является глобальным объектом в JavaScript. В скрипте можно писать так:

window.str = 'Строка';
window.alert(this.str); /* this работает, т.к. действие внутри window */

В JavaScript может быть всего один глобальный объект, поэтому его можно не указывать, но тогда var обязателен.

var str = 'Строка';
alert(str);

Все свойства и методы глобального объекта доступны в любом месте программы.

function show() {
  alert('Сработало');
}

show(); /* Сработало */

Если необходимо обратиться именно к свойству объекта window, это лучше указать явно. Например, такой код ничего не выдаст:

function show() {
  alert('Сработало'); /* выполнится локальный alert() */

  function alert() {}
}

show();

А так будет работать:

function show() {
  window.alert('Сработало'); /* выполнится alert() объекта window */

  function alert() {}
}

show();

Глобальных свойств и методов очень много. Вот так можно получить весь список свойств window как глобального объекта и как объекта окна браузера:

var props = '';
for (var prop in this) {
  props += prop + '\n';
}
alert(props);

Среди всех свойств также указаны prop и props, потому что JavaScript инициализирует все функции и переменные перед выполнением скрипта.

Глобальные свойства

Infinity

Свойство Infinity имеет числовой тип и равно положительной бесконечности. Этому свойству нельзя присвоить другое значение. Однако, имя Infinity можно использовать для задания локальных переменных, так как оно не определено как ключевое слово JavaScript. Для бесконечности выполняются условия:

  • Бесконечность больше любого числа.
  • Произведение любого числа на бесконечность дает бесконечность.
  • Деление на бесконечность дает 0.

NaN

Свойство NaN имеет числовой тип со значением NaN. Этому свойству нельзя присвоить другое значение. Однако, имя NaN можно использовать для задания локальных переменных, так как оно не определено как ключевое слово JavaScript.

undefined

Свойство undefined представляет примитивное значение undefined. Этому свойству нельзя присвоить другое значение. Однако, имя undefined можно использовать для задания локальных переменных, так как оно не определено как ключевое слово JavaScript.

Глобальные методы

eval()

Метод eval() выполняет код JavaScript, представленный в виде строки. Аргументом передается строка, которая может содержать простое выражение или набор операторов. В передаваемой строке можно использовать переменные и свойства существующих объектов.

var str = 'alert(num * 2 - 5)';
var num = 10;
eval(str);

Метод eval() возвращает последнее вычисленное выражение.

var num = eval('1 * 2; 2 * 2');
alert(num);

Если аргументом передается не строка, тогда eval() возвращает аргумент без изменений.

isFinite()

Метод isFinite() преобразует переданное ему значение к числовому типу и проверяет, является ли оно конечным числом, то есть не NaN или ±Infinity. Метод возвращает значения true или false.

alert(isFinite(undefined)); // false
alert(isFinite(NaN)); // false
alert(isFinite('str')); // false
alert(isFinite({a: 1})); // false
alert(isFinite(Infinity)); // false
alert(isFinite('1')); // true
alert(isFinite(null)); // true
alert(isFinite(false)); // true

Данный метод нельзя использовать для проверки принадлежности к числовому типу. Однако, с его помощью можно определить, является ли значение, введённое пользователем, числом или нет. Это следует из того, что вся вводимая пользователем информация представляется в виде строк (если ввести null, то это будет именно строка null). Таким образом, заведомо известно, что методу будет передана некая строка или значение undefined, если ничего не получено от пользователя (если получена пустая строка, то она расценивается как число 0). Следовательно, метод isFinite() вернёт значение true, только если введённая строка может быть преобразована к конечному числу (±Infinity исключаются).

<script>
var num;
num = prompt('Введите число');
if (num !== null) { /* если prompt() не отменено */
  if (isFinite(num)) {
    alert('Вы ввели конечное число.');
  } else {
    alert('Вы ввели не число.');
  }
}
</script>

Если существует вероятность, что методу isFinite() будут переданы значения null, true или false, тогда их необходимо исключать отдельной проверкой.

isNaN()

Метод isNaN() преобразует переданный ему параметр к числовому типу и возвращает true, если получилось NaN.

alert(isNaN(undefined)); // true
alert(isNaN(NaN)); // true
alert(isNaN('str')); // true
alert(isNaN({a: 1})); // true
alert(isNaN(Infinity)); // false
alert(isNaN('1')); // false
alert(isNaN(null)); // false
alert(isNaN(false)); // false

Чтобы получить точный результат (без преобразования к числовому типу), можно воспользоваться оператором сравнения:

function ISNAN(a) {
  return (a != a); /* только NaN не равен себе */
}

alert(ISNAN(NaN)); // true
alert(ISNAN(undefined)); // false
alert(ISNAN('str')); // false
alert(ISNAN(Infinity)); // false

Так получается, потому что только NaN не равен себе.

parseFloat()

Метод parseFloat() проверяет переданную ему строку и возвращает вещественное число. Проверка строки идет посимвольно. Если символ не является знаком (+ или -), цифрой (0-9), точкой или экспонентой, то функция отбрасывает все оставшиеся символы. Начальные и конечные пробелы отбрасываются перед проверкой.

alert(parseFloat('+200')); // 200
alert(parseFloat('2.e+2')); // 200
alert(parseFloat('2E+2')); // 200
alert(parseFloat('200px')); // 200

Если проверка прерывается сразу на первом символе, то parseFloat() возвращает NaN. parseFloat() может вернуть значение бесконечности.

alert(parseFloat('"200"')); // NaN
alert(parseFloat('-Infinity')); // -Infinity

parseInt()

Метод parseInt() возвращает целое десятичное число из переданной ему строки. Первым аргументом указывается строка, в которой идет поиск числа. Если аргумент не является строкой, то он преобразуется в строковый тип. Проверка строки идет посимвольно после удаления начальных и конечных пробелов. Если найден недопустимый символ, то остальные символы отбрасываются. Если проверка останавливается на первом символе, то возвращается NaN. Допустимые символы определяются вторым аргументом функции.

Вторым аргументом указывается система счисления, в которой записан первый аргумент. Допускаются системы счисления с основанием от 2 до 36. Метод parseInt() конвертирует число из указанной системы счисления в десятичную и возвращает.

alert(parseInt('2e+3', 16)); /* 46, прервано на '+' */
alert(parseInt('2e+3', 10)); /* 2, прервано на 'e' */
alert(parseInt('2e+3', 2)); /* NaN, прервано на '2' */

Если второй аргумент опущен или равен 0, система счисления устанавливается браузером:

  • Если строка начинается с 0x или 0X, то основание системы 16.
  • Если строка начинается с 0, то основание системы 10. Но некоторые браузеры используют основание 8.
  • В остальных случаях используется основание 10.

Чтобы parseInt() работал во всех браузерах одинаково, всегда нужно указывать второй аргумент.

encodeURI()

Метод encodeURI() кодирует полный универсальный идентификатор ресурса (URI). Он производит замену некоторых символов их кодом в кодировке UTF-8. Не кодируются:

Зарезервированные символы универсального идентификатора ; , / ? : @ & = + $
Неэкранируемые символы все буквы латинского алфавита,
цифры,
- _ . ! ~ * ' ( )
Решётка #
alert(encodeURI('/search.html?query=<>324!#$@%":L'));
/*
/search.html?query=%3C%3E324!#$@%25%22:L
  < преобразовано в %3C
  > преобразовано в %3E
  % преобразовано в %25
  " преобразовано в %22
*/

encodeURIComponent()

Метод encodeURIComponent() кодирует часть универсального идентификатора ресурса (URI). Он производит замену некоторых символов их кодом в кодировке UTF-8. Не кодируются: все буквы латинского алфавита, цифры, - _ . ! ~ * ' ( ).

Чтобы избежать неправильных запросов к серверу, нужно применять метод encodeURIComponent() на любые введенные пользователем параметры, которые будут переданы как часть URI. Например, если пользователь для переменной voice введет строку 1 &again=false, то на сервер отправится строка voice=1%20&again=false. Получается два ключевых значения voice и again вместо одного. Использование encodeURIComponent() приведёт к отправке строки voice=1%20%26again%3Dfalse с правильным ключевым значением.

decodeURI()

Метод decodeURI() раскодирует URI, созданный при помощи метода encodeURI() или аналогичного. Заменяет UTF-8 коды символами.

decodeURIComponent()

Метод decodeURIComponent() раскодирует URI, созданный при помощи метода encodeURIComponent() или аналогичного. Заменяет UTF-8 коды символами.