Lua представляет собой dynamically typed language. Это означает, что переменные не имеют типов, а только значения. Следовательно, не имеется никаких определений типов на языке. Все значения несут их собственный тип. Помимо типа все значения также имеют тэг.
Имеются шесть базисных типов в Lua: nil, number (число), string (строка), function 
(функция), userdata (пользовательские 
данные) и table (таблица). Nil тип 
значения nil, чье основное свойство должно отличаться от любого другого 
значения. Number представляет реальные (двойная точность с плавающей 
запятой) числа, в то время как string имеет обычное значение. Lua 
нормально понимает 8-разрядные символы, так что строки могут содержать любой 
8-разрядный символ, включая вложенные нули ('\0'). Подробности в 
разделе 4.1. 
Функция type возвращает строку, описывающую тип данного значения 
(подробности в разделе 6.1). 
Функции рассматриваются как значения первого класса (first-class 
values) в Lua. Это означает, что функции могут быть сохранены в переменных, 
переданы как параметры другим функциям и возвращены как результаты. Lua может 
вызывать и управлять как функциями, написанными на Lua, так и функциями, 
написанными на C. Два вида функций могут различаться их тэгами: все функции Lua 
имеют тот же самый тэг, и все функции C имеют свой тэг, который отличается от 
тэга функций Lua. Функция tag возвращает тэг данного значения 
(подробности в разделе 6.1). 
Тип userdata обеспечивается, чтобы позволить произвольным 
C-указателям быть сохраненными в Lua-переменных. Этот тип соответствует 
void* и не имеет никаких предопределенных операций в Lua, за 
исключением теста равенства и назначения. Однако, используя методы 
тэгов, программист может определять операции для значений 
userdata. Подробности в разделе 4.8. 
Тип table осуществляет ассоциативные массивы, то есть массивы, 
которые могут быть индексированы не только числами, а любыми значениями (за 
исключением nil). Следовательно, этот тип может использоваться не только, 
чтобы представить обычные массивы, но также и символные таблицы, наборы, записи, 
графы, деревья и т.д. Таблицы представляют собой основной механизм, 
структурирующий данные в Lua. Чтобы представлять записи (records), Lua использует имя поля как индекс. Язык поддерживает 
это представление, обеспечивая a.name как синтаксический аналог для 
a["name"]. Таблицы могут также нести методы: поскольку 
функции представляют собой значения первого класса, поля таблицы могут содержать 
функции. Форма t:f(x) синтаксический аналог для 
t.f(t,x), который вызывает метод f из таблицы 
t прохождением таблицы непосредственно как первый параметр 
(подробности в разделе 4.5.9). 
Обратите внимание, что таблицы представляют собой объекты, а не значения. Переменные не содержат таблицы, только ссылаются на них. Назначение, обработка параметра и возврат всегда управляют ссылками на таблицы и не подразумевают никакого вида копирования. Кроме того, таблицы должны быть явно созданы прежде, чем используются. Подробности в разделе 4.5.7.
Каждый из типов nil, number и string имеет свой 
тэг. Вообще, очень многое в Lua построено именно вокруг тэгов. Все значения 
каждого из этих типов имеют тот же самый предопределенный тэг. Как объяснено 
выше, значения типа function могут иметь два различных тэга в 
зависимости от того, являются ли они функциями Lua или функциями C. В 
заключение, значения типов userdata и table могут иметь 
переменные тэги, назначенные программистом (подробности в разделе
4.8). 
Функция tag возвращает тэг данного значения. Пользовательские тэги 
могут быть созданы функцией newtag. Функция settag 
используется, чтобы изменить тэг таблицы (подробности в разделе
6.1). 
Тэг значений userdata может быть установлен из C (подробности в разделе
5.7). 
Тэги главным образом используются, чтобы выбрать соответствующие методы 
тэгов, когда происходят некоторые события. Методы тэгов представляют собой 
основной механизм для распространения семантики Lua (подробности в разделе
4.8).