Урок 03

Типы данных

В JavaScript восемь типов. Семь примитивных и один объектный.

Примитивы

number

Все числа — number:

let a = 42;
let b = 3.14;
let c = -1;
let d = Infinity;
let e = NaN;      // Not a Number
let f = 0xff;     // 255
let g = 1_000_000;

bigint

Для чисел больше Number.MAX_SAFE_INTEGER:

const big = 9007199254740993n;
const bigger = BigInt('9007199254740993');

string

let a = 'одинарные';
let b = "двойные";
let c = `шаблонные ${a}`;

Многострочные:

const text = `Первая строка
Вторая строка`;

boolean

let t = true;
let f = false;

null

Явное «ничего»:

let user = null;

undefined

Значение по умолчанию для необъявленных:

let x;
console.log(x); // undefined

symbol

Уникальные ключи:

const id = Symbol('id');
const obj = { [id]: 1 };

Объект

Всё, что не примитив — объект:

const user = { name: 'Алиса' };
const items = [1, 2, 3];
const fn = () => {};
const date = new Date();

Массивы, функции, даты, регулярки — всё объекты.

typeof

Проверка типа:

typeof 'строка';        // 'string'
typeof 42;              // 'number'
typeof true;            // 'boolean'
typeof undefined;       // 'undefined'
typeof null;            // 'object' — историческая ошибка
typeof Symbol();        // 'symbol'
typeof 10n;             // 'bigint'
typeof {};              // 'object'
typeof [];              // 'object'
typeof function() {};   // 'function'

typeof null === 'object' — баг, оставленный для совместимости.

Для массива:

Array.isArray([]); // true

Приведение типов

Явное

Number('42');      // 42
String(42);        // '42'
Boolean(0);        // false
parseInt('42px');  // 42
parseFloat('3.14'); // 3.14

Неявное

'5' + 3;   // '53' — конкатенация
'5' - 3;   // 2 — вычитание
'5' * '2'; // 10
1 + true;  // 2
1 + null;  // 1
1 + undefined; // NaN

Truthy и falsy

При приведении к boolean:

Falsy:

  • false
  • 0, -0, 0n
  • '' (пустая строка)
  • null
  • undefined
  • NaN

Truthy: всё остальное, включая '0', [], {}, 'false'.

if ([]) console.log('truthy'); // выполнится
if ('') console.log('falsy');  // не выполнится

Проверка NaN

Number.isNaN(NaN);      // true
Number.isNaN('строка'); // false
isNaN('строка');        // true — приводит к числу

Используй Number.isNaN.

Сравнение

0 == '';       // true — нестрогое
0 === '';      // false — строгое
null == undefined;  // true
null === undefined; // false
NaN === NaN;   // false

Правило: используй === и !== всегда, кроме проверки x == null (проверяет и null, и undefined).

Object.is

Object.is(NaN, NaN);   // true
Object.is(0, -0);      // false

Отличие от === только в этих двух случаях.

Итоги

  • Семь примитивов + объект
  • typeof для проверки типа
  • Array.isArray для массивов
  • Неявное приведение — источник багов
  • Falsy: false, 0, '', null, undefined, NaN
  • === вместо ==