Возьмем С++. В нем есть базовые типы данных (int - тип для целых чисел; float и double - типы для дробных чисел, bool - тип для хранения логической величины) и базовые операторы (+, -, *, / - для создания выражений с арифметическими операциями; ||(или), &&(и), !(не) - для выражений с логическими операциями; ==, !=, >, <, <=, >= - для выражений со сравнением, = - оператор присваивания, вычисляющий значение выражения и сохраняющий его в переменную. Так же есть операторы управляющие ходом выполнения программы (циклы - for, while, do..while; ветвление программы - if..else, switch). С помощью создания переменных для хранения значений базовых типов, и описания последовательности выполнения базовых операторов над этими переменными, можно написать любую программу. Но она может получиться длинной и запутанной. Для локаничной записи используют группировку базовых элементов в пользовательские составные элементы. Это пользовательские типы данных (для переменных) - структуры и классы; и пользовательские операторы - функции. После описания пользователем собственных типов и собственных функций их можно использовать в программе на ровне с базовыми.
Если взять JavaScript, то всё очень похоже. Отличие в том, что не нужно заранее предупреждать компилятор (которого нет, а есть интерпретатор) о типе переменных. Переменные резиновые и хранят в себе всё, что в них положат. Будь то значение базового типа или пользовательского.