В JavaScript существует 8 типов данных:
Примитивные типы (7):
number
— числаstring
— строкиboolean
— логический типundefined
— неопределенное значениеnull
— пустое значениеsymbol
— уникальный идентификатор (ES6)bigint
— большие целые числа (ES2020)Ссылочный тип (1):
object
— объекты (включая массивы, функции, даты и т.д.)Включает целые числа, дробные, специальные значения.
let age = 25; // целое число
let price = 99.99; // дробное число
let infinity = Infinity; // бесконечность
let notANumber = NaN; // "не число"
console.log(typeof age); // "number"
console.log(typeof infinity); // "number"
console.log(typeof notANumber); // "number"
Особенности:
Number.MAX_SAFE_INTEGER
(2^53 - 1)NaN
не равно самому себе: NaN === NaN
→ false
Number.isNaN()
, Number.isFinite()
Последовательность символов в кавычках.
let name = "Александр"; // двойные кавычки
let surname = 'Ермолов'; // одинарные кавычки
let fullName = `${name} ${surname}`; // шаблонные строки (ES6)
console.log(typeof name); // "string"
console.log(fullName); // "Александр Ермолов"
Особенности:
name[0]
или name.charAt(0)
name.length
Только два значения: true
или false
.
let isActive = true;
let isCompleted = false;
let isAdult = age >= 18; // результат сравнения
console.log(typeof isActive); // "boolean"
Преобразование к boolean:
// Falsy значения (приводятся к false):
Boolean(0); // false
Boolean(""); // false
Boolean(null); // false
Boolean(undefined); // false
Boolean(NaN); // false
Boolean(false); // false
// Все остальное — truthy (приводится к true)
Boolean(1); // true
Boolean("hello"); // true
Boolean([]); // true
Boolean({}); // true
Значение переменной, которая объявлена, но не инициализирована.
let x;
console.log(x); // undefined
console.log(typeof x); // "undefined"
// Функция без return тоже возвращает undefined
function test() {
// нет return
}
console.log(test()); // undefined
Представляет намеренное отсутствие значения.
let data = null;
console.log(data); // null
console.log(typeof data); // "object" (это баг в JS!)
// Правильная проверка на null
console.log(data === null); // true
Разница между null
и undefined
:
let a; // undefined (не инициализирована)
let b = null; // null (намеренно пустая)
console.log(a == b); // true (нестрогое сравнение)
console.log(a === b); // false (строгое сравнение)
Уникальный идентификатор, введенный в ES6.
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 === id2); // false (всегда уникальны)
console.log(typeof id1); // "symbol"
// Использование в объектах
let user = {
name: "Александр",
[id1]: 123 // символ как ключ
};
console.log(user[id1]); // 123
Для работы с числами больше Number.MAX_SAFE_INTEGER
.
let bigNumber = 123456789012345678901234567890n; // суффикс 'n'
let anotherBig = BigInt("123456789012345678901234567890");
console.log(typeof bigNumber); // "bigint"
// Нельзя смешивать с обычными числами
// console.log(bigNumber + 1); // TypeError!
console.log(bigNumber + 1n); // работает
Все, что не является примитивом — это объект.
// Обычный объект
let person = {
name: "Александр",
age: 30
};
// Массив (тоже объект!)
let numbers = [1, 2, 3, 4, 5];
// Функция (тоже объект!)
function greet() {
return "Привет!";
}
// Дата (объект)
let now = new Date();
console.log(typeof person); // "object"
console.log(typeof numbers); // "object"
console.log(typeof greet); // "function" (особый случай)
console.log(typeof now); // "object"
Различие примитивов и объектов:
// Примитивы передаются по значению
let a = 5;
let b = a;
a = 10;
console.log(b); // 5 (не изменилось)
// Объекты передаются по ссылке
let obj1 = { x: 5 };
let obj2 = obj1;
obj1.x = 10;
console.log(obj2.x); // 10 (изменилось!)
Тип данных | typeof | Пример проверки |
---|---|---|
number | ”number” | typeof 42 |
string | ”string” | typeof "hello" |
boolean | ”boolean” | typeof true |
undefined | ”undefined” | typeof undefined |
symbol | ”symbol” | typeof Symbol() |
bigint | ”bigint” | typeof 123n |
function | ”function” | typeof function(){} |
object | ”object” | typeof {} , typeof [] |
null | ”object” | value === null |
Более точные способы проверки:
// Проверка массива
Array.isArray([1, 2, 3]); // true
Array.isArray({}); // false
// Проверка null
value === null; // true для null
// Проверка NaN
Number.isNaN(NaN); // true
isNaN("hello"); // true (но неточно!)
// Универсальная проверка типа
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"
console.log(typeof null);
console.log(typeof NaN);
let a = [];
let b = {};
let c = function() {};
console.log(typeof a, typeof b, typeof c);
console.log(0 == false);
console.log("" == false);
console.log(null == undefined);
let x = Symbol("test");
let y = Symbol("test");
console.log(x === y);
let big = 9007199254740991n;
console.log(typeof big);
console.log(big + 1);
// Плохо
if (value == null) { /* ... */ }
// Хорошо
if (value === null || value === undefined) { /* ... */ }
// или
if (value == null) { /* только для проверки null/undefined */ }
// Для массивов
if (Array.isArray(value)) { /* ... */ }
// Для null
if (value === null) { /* ... */ }
// Для объектов (исключая null и массивы)
if (typeof value === "object" && value !== null && !Array.isArray(value)) {
/* ... */
}
// Неожиданные результаты
console.log("5" + 3); // "53" (конкатенация)
console.log("5" - 3); // 2 (вычитание)
console.log(+"5"); // 5 (унарный плюс)
console.log(!!"hello"); // true (двойное отрицание)
typeof null === "object"
— это баг, используйте === null
Знание типов данных — это основа JavaScript, без которой невозможно писать качественный код!
Хочешь больше статей по подготовке к собеседованию? Подпишись на EasyAdvice(@AleksandrEmolov_EasyAdvice), добавляй сайт в избранное и прокачивай себя каждый день 💪