← Назад к вопросам

К какому типу относятся функции, массивы и объекты

2.3 Middle🔥 152 комментариев
#JavaScript Core

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы данных: функции, массивы и объекты в JavaScript

В JavaScript все значения делятся на две категории: примитивные и объектные. Функции, массивы и объекты - это объектные типы (Reference types), которые ведут себя совершенно иначе, чем примитивы.

Примитивные типы (Primitive Types)

Для сравнения, примитивы включают:

  • number - 42, 3.14
  • string - 'hello'
  • boolean - true, false
  • null
  • undefined
  • symbol (ES2015+)
  • bigint (ES2020+)

Примитивы хранят значение непосредственно и сравниваются по значению:

const a = 5;
const b = 5;
console.log(a === b); // true - одинаковые значения

Объектные типы (Reference Types)

Функции, массивы и объекты - это объекты (Objects). Они хранят ссылку на данные в памяти и сравниваются по ссылке:

const obj1 = { name: 'John' };
const obj2 = { name: 'John' };
console.log(obj1 === obj2); // false - разные ссылки в памяти

Объекты (Objects)

Общий тип для всех объектных данных. Это пара ключ-значение:

const user = {
  name: 'Alice',
  age: 30,
  greet: function() {
    return `Hello, I'm ${this.name}`;
  }
};

console.log(typeof user); // 'object'
console.log(user.name); // 'Alice'
console.log(user['age']); // 30

Массивы (Arrays)

Массивы - это специальный тип объекта, оптимизированный для хранения упорядоченных коллекций. Они имеют числовые индексы и свойство length:

const numbers = [1, 2, 3, 4, 5];
console.log(typeof numbers); // 'object' - массив это объект!
console.log(Array.isArray(numbers)); // true - проверка на массив
console.log(numbers[0]); // 1
console.log(numbers.length); // 5

const mixed = [1, 'hello', true, { id: 1 }, [1, 2]];
console.log(mixed[3].id); // 1

Важно: typeof array === 'object', поэтому для проверки используйте Array.isArray():

const arr = [];
console.log(typeof arr); // 'object'
console.log(Array.isArray(arr)); // true

Функции (Functions)

Функции - это первоклассные объекты (first-class objects). Они могут:

  • Передаваться как аргументы
  • Возвращаться из других функций
  • Назначаться переменным
const greet = function(name) {
  return `Hello, ${name}`;
};

console.log(typeof greet); // 'function' (специальный случай)

// Функция это объект со свойствами
greet.custom = 'My property';
console.log(greet.custom); // 'My property'

// Функции имеют методы
console.log(greet.length); // 1 (количество параметров)
console.log(greet.name); // 'greet'

// Передача функции как аргумент
function execute(fn) {
  return fn('World');
}
console.log(execute(greet)); // 'Hello, World'

// Возврат функции
function createGreeter(greeting) {
  return function(name) {
    return `${greeting}, ${name}`;
  };
}
const sayHi = createGreeter('Hi');
console.log(sayHi('Alice')); // 'Hi, Alice'

Сравнение по ссылке

Все объектные типы сравниваются по ссылке на объект в памяти:

const obj = {};
const sameRef = obj;
const different = {};

console.log(obj === sameRef); // true - одна и та же ссылка
console.log(obj === different); // false - разные ссылки

const arr1 = [1, 2];
const arr2 = [1, 2];
console.log(arr1 === arr2); // false - разные ссылки

const fn1 = () => {};
const fn2 = () => {};
console.log(fn1 === fn2); // false - разные ссылки

Методы для проверки типов

// Проверка типов
console.log(typeof 42); // 'number'
console.log(typeof 'hello'); // 'string'
console.log(typeof true); // 'boolean'
console.log(typeof undefined); // 'undefined'
console.log(typeof {}); // 'object'
console.log(typeof []); // 'object' (!)  
console.log(typeof function(){}); // 'function'

// Улучшенные проверки
console.log(Array.isArray([])); // true
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(function(){} instanceof Function); // true

Мутация vs Переприсваивание

Объектные типы поддерживают мутацию (изменение внутреннего состояния):

const obj = { name: 'John' };
obj.name = 'Jane'; // мутация - изменение свойства
console.log(obj.name); // 'Jane'

const arr = [1, 2, 3];
arr[0] = 99; // мутация элемента
arr.push(4); // мутация массива
console.log(arr); // [99, 2, 3, 4]

Копирование объектов

При копировании создаётся новая ссылка:

const original = { name: 'John' };
const reference = original; // копируется ссылка
reference.name = 'Jane';
console.log(original.name); // 'Jane' - изменение видно везде

// Поверхностное копирование
const shallow = { ...original };
shallow.name = 'Bob';
console.log(original.name); // 'Jane' - не связано

// Глубокое копирование
const deepCopy = structuredClone(original);

Итог

Функции, массивы и объекты относятся к объектным типам (Reference Types), которые:

  • Хранят ссылку на данные, а не само значение
  • Сравниваются по ссылке (a === b проверяет адрес в памяти)
  • Поддерживают мутацию свойств и элементов
  • Передаются по ссылке в функции

Массивы - это специализированные объекты с числовыми индексами, функции - первоклассные объекты, которые можно присваивать переменным и передавать как аргументы.