01. Данные

Типы данных JavaScript

Типы данных JavaScript

JavaScript поддерживает следующие типы данных:

  • Элементарные типы данных
    • числа
    • строки
    • логические значения
  • Объекты
    • массивы
    • функции
    • встроенные объекты языка (такие как Math)
    • объекты документа (такие как window)
    • объекты, создаваемые программистом

Первое удивление: функция отнесена к данным? Как это? Да, это особенность JavaScript, в которую, программирующие на Си или Паскале, поначалу отказываются верить! Посмотрите на выражение, которое выполняет сортировку элементов массива a по возрастанию:


a.sort(function(a,b){return a-b;}); 

Видим, что в качестве аргумента метода sort() записано определение безымянной функции. То есть функция function(a,b){return a-b;} передаётся внутрь другой функции a.sort() как данные.

Можно написать такой код:


function test(f)
{
  var y = 10;
  return f(y);
} 
var z = test(function(a){return a*a;})  //  z станет равным 100 
var t = test(function(a){return a+a;})  //  z станет равным 20 

Непривычно? А какие открываются возможности! Ну, ладно, давайте разбираться по-порядку.

Выражение function(a){return a*a;}, как и function(a){return a+a;} является литералом. Ничем не хуже и не лучше литерала-числа 25 или литерала-строки "Роботландия".

Литерал — это значение данных, указанное непосредственно в теле программы. Литерал, в отличие от переменной, не имеет имени, поэтому срок его жизни ограничен тем контекстом, в котором он расположен.

Например, запись x+1 представляет собой выражение, в котором суммируются значение переменной x и значение литерала 1.

Примеры литералов:


25             // Литерал-число 
"Роботландия"  // Литерал-строка
true           // Литерал логического значения
[25, "Роботландия", true] // Литерал массива из трех элементов
function(a){return a*a;}  // Литерал функции
{x:1, f:function(a){return a*a;}} // Литерал объекта, в котором  
                                  // определено свойство x и метод f.
                                  // Свойству x присвоено значение 
                                  // литерала 1, а методу f значение 
                                  // литерала function(a){return a*a;}

Определить тип данных можно при помощи унарного оператора typeof, который размещают перед своим операндом:


typeof 25                        // Значением будет строка "number"
typeof "Роботландия"             // Значением будет строка "string"
typeof true                      // Значением будет строка "boolean"
typeof [25, "Роботландия", true] // Значением будет строка "object"
typeof function(a){return a*a;}  // Значением будет строка "function"
typeof {x:1, y:2}                // Значением будет строка "object"
typeof Date                      // Значением будет строка "object"
typeof x                         // Значением будет строка, обозначающая
                                 // тип данных, находящихся в переменной
                                 // x в текущий момент

Операнд оператора typeof можно заключать в круглые скобки, и тогда операция будет смотреться как вызов функции:


typeof(25)            // Равно "number"
typeof("Роботландия") // Равно "string"

Обратите внимание, тип функции определяется строкой "function", а не "object", хотя функции (как и массивы) являются специализированными объектами в языке JavaScript.