Друкарня від WE.UA

JavaScript [numbers] Як додавати обʼєкти ?

Примітив такий як число - це базова тема яку проходять 1 раз і більше до неї ніколи не повертаються. Але, що буде якщо пройти цю тему ще раз по документації і враховуючи весь досвід який ви назбирали.

Думаю, буде цікаво.

Що таке Number в javaScript ?

Number - це конструктор, який надає константи та методи для роботи з числами.

У JS не обовʼязково писати Number(‘1’); - можна користуватись оператором ʼунарний плюсʼ

const constructorNumber = Number('1');
const simplePlusNumber = +'1';
const simpleNumber = 1;

У результаті отримаємо 3 однакових значення.

Варто сказати - що як і у будь яких мовах, у JS числа мають межі. Після виходу за які втрачається точність обрахунків:

JS виділяє аж цілих 53 біта бід будь-яке число (C++ деви в шоці).

Number.MIN_SAFE_INTEGER = -(2^53) – 1 // -9007199254740991;
Number.MAX_SAFE_INTEGER = (2^53) – 1 // 9007199254740991;

Це числа в межах яких ви не будете втрачати точність при математичних операціях - насправді будете.

Також в Number є поле MAX_VALUE значення якого: 1.7976931348623157e+308

1.7976931348623157e+308 - то дуже багато. і читається це як: 1.7976931348623157 ^ (10 ^ 308);

Але яка різниця між MAX_SAFE_INTEGER та MAX_VALUE ?

У недрі

JS використовує стандарт IEEE 754 для роботи з числами. Грубо говорячи - цей стандарт описує скіко бітів виділяти під певні категорії числа.

  1. Знак

  2. Степінь

  3. mantissa (ціла або дробна частина, або і ціла і дробна разом)

Так розділяється памʼять для 32х бітів. Для 64 майже теж саме.

Але яка рзниця між MAX_SAFE_INTEGER та MAX_VALUE ?

Є числа які називаються integer, а є float numbers - цілі і дробові. У Джаваскрипті всі числа по дефолту - float; тому він резервує біти під цілу частину числа і під дробну. MAX_SAFE_INTEGER - це максимальне число яке можна отримати із 64х бітів врахочуючи що 11 бітів піде на показник степені (і ще 1 бай на знак);

53 біти які залишились називають - (mantissa) - це матиматечне поняття яке ще називають ʼнеоднозначний дрібʼ - тобто може бути або дробним числом або цілим, або взагалі нічого - 0.

mantissa

MAX_VALUE - ігнорує частину про дробові числа, правильніше це назвати MAX_INTEGER - це максимальне число яке можна отримати із всіх 64х бітів (1 біт - 8 байт) якщо заповнити всі клітинки одиничками;

А що після MAX_VALUE ?

Як говорить специфікація - якщо вийти за межі MAX_VALUE, то ви отримаєте спеціальну константу Infinity;

І в цьому моменті мені подобається те - що матиматично джаваскрипт працює із безкінечністю правильно.

Ділити на 0 = Infinity
Дуже велике число = Infinity
Infinity + Infinity = Infinity

typeof Infinity // number

Що ми можемо робити працюючи з числами ?

як ми можемо дефайнити числа та які є варіації:

const numberLiteral = 1; // 1
const numberConstructor = Number(1); // 1
const numberHex = 0xff; // 255
const numberBinary = 0b1; // 1
const numberOctal = 0o11; // 9
const numberExponential = 1e2; // 200
const numbrtBigInt = 2n; // 2n

const numberNaN = NaN; // NaN
const numberNaN = Number.NaN; // NaN
const numberPositiveInfinity = Infinity; // Infinity
const numberNegativeInfinity = -Infinity; // -Infinity
const numberPositiveZero = 0; // 0
const numberNegativeZero = -0; // -0

// Numeric Separators

const numberSeparator = 7_600_000_000; // 760000000
const numberSeparatoeBinary = 0b1111_1111; // 255
const numberSeparatorHex = 0xFF_EF_D5; // 16773077
const numberSeparatorBigInt = 10_000_000n; // 10000000n

Надіюсь нічого не пропустив, робив цей сніпет ще 2 роки тому, можливо, щось забув.

Але про що варто сказати. У цьому прикладі також є BigInt, якщо коротко - це псевдоконструктор для роботи із дуже великими числами. Не знайшов яке може бути максимальне значення, але в інтернетах пишуть що на 512 бітах ще вивозить.

const number = new Number(1); // Number {1}
const bigInt = BigInt(1); // 1n - немає ключового слова "new"

Також для BigInt чисел не працює побітовий оператор “>>>”. Також не знайов пояснення у документаціях, але цей оператор “зсув із заповненням" має замінити всі зайві операнди нулями, і для 512біт то ресурсозатратна операція, тому її не реалізовували (IMHO).

NaN

По смішності це 2й прикол після undefined який є у JS;

У будь які не зрозумілій дивній ситуації при роботі із числами ви отримуєте - NaN

// NaN - Not a Number
typeof NaN // number

у джаваскрипт існує аж цілих 2 NaN і також 2 методи для роботи із ними.

const oldNaN = window.NaN;
const newNaN = Number.NaN;
Як вони взаємодіють ? (НІЯК)
Number.NaN // ES6

NaN === NaN; // false
NaN == NaN; // false
NaN == false; // false
NaN == true; // false
NaN == undefined

NaN >= NaN; // false
NaN <= NaN; // false

NaN === Number.NaN; //false
NaN == Number.NaN; //false

І відповідно є 2 методи для перевірки чи це значення дійсно NaN

isNaN(NaN); // true
isNaN('a'); // true
isNaN(undefined); // true
isNaN(1); // false

isNaN(Function); // true
isNaN({}); // true
isNaN(/regExp/); // true
isNaN(null); // false

// Number.isNaN

Number.isNaN(NaN); // true
Number.isNaN('a'); // false
Number.isNaN(undefined); // false
Number.isNaN(1); // false
Number.isNaN(Function); // false
Number.isNaN({}); // false
Number.isNaN(/regExp/); // false
Number.isNaN(null); // false

Як можна побачити window.isNaN - то супер поломана функція. Не використовуйте її.

Користуйтесь тільки - Number.isNaN();

Лайфхак із 2015, як перевірити NaN
const nan1 = NaN;
const nan2 = NaN;

const isNaN = nan1 !== nan2 && !(nan1 === nan2); // true;

Як додавати обʼєкти ?

У JS - це можливо

const magic = {} + {} // NaN

Звісно, це не те що ви хотіли побачити…

Тому давайте копати:

const num1 = new Number(1);
const num2 = new Number(1);

typeof num1 // 'object'
typeof num2 // 'object'

const magic = num1 + num2 // 2

typeof magic // 'number'

трохи краще, але все ще дуже просто.

Якщо ви дочитали до цього моменту то пора зробити справжню магію:

const num1 = {
    [Symbol.toPrimitive](hint){
        if(hint === 'number') {
           return 1;
       }
       
       return 'string 1';
    },
    someProp: 'real magic',
}

const num2 = {
    [Symbol.toPrimitive](hint){
        if(hint === 'number') {
           return 1;
       }
       
       return 'string 2';
    },
    someProp: 'real magic',
}

const MAGIC = num1 + num2; //'string 1string 2' складає як рядки

const MAGIC_NUMBER = +num1 + +num2; // 2 - буде число 2

Оце уже та магія яку всі чекали. Справді додаємо 2 обʼєкти і отримуємо або число або рядок, ну це можна налаштувати.

Підсумки

Підказки про числа

Тож якщо ви думали що досконально знаєте JS бо розумієте функції-генератори, або ще якісь ʼтипу складні штукиʼ, то подивіться скільки магії можна робити із простими числами.

На цьому все, якщо якийсь момент вам не зрозумілий, пишіть коментарі - будуть ідеї для наступних матеріалів.

Статті про вітчизняний бізнес та цікавих людей:

  • Вітаємо з Різдвом Христовим!

    Друкарня та платформа WE.UA вітають всіх наших читачів та авторів зі світлим святом Різдва! Зичимо всім українцям довгожданого миру, міцного здоровʼя, злагоди, родинного затишку та втілення всього доброго і прекрасного, чого вам побажали колядники!

    Теми цього довгочиту:

    Різдво
  • Каблучки – прикраси, які варто купувати

    Ювелірні вироби – це не тільки спосіб витратити гроші, але і зробити вигідні інвестиції. Бо вартість ювелірних виробів з кожним роком тільки зростає. Тому купуючи стильні прикраси, ви вигідно вкладаєте кошти.

    Теми цього довгочиту:

    Як Вибрати Каблучку
  • П'ять помилок у виборі домашнього текстилю, які псують комфорт сну

    Навіть ідеальний матрац не компенсує дискомфорт, якщо текстиль підібрано неправильно. Постільна білизна безпосередньо впливає на терморегуляцію, стан шкіри та глибину сну. Більшість проблем виникає не через низьку якість виробів, а через вибір матеріалів та подальшу експлуатацію

    Теми цього довгочиту:

    Домашній Текстиль
  • Як знайти житло в Києві

    Переїжджаєте до Києва і шукаєте житло? Дізнайтеся, як орендувати чи купити квартиру, перевірити власника та знайти варіанти, про які зазвичай не говорять.

    Теми цього довгочиту:

    Агентство Нерухомості
  • Як заохотити дитину до читання?

    Як залучити до читання сучасну молодь - поради та факти. Користь читання для дітей - основні переваги. Розвиток дітей - це наше майбутнє.

    Теми цього довгочиту:

    Читання
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Valentyn Tupota
Valentyn Tupota@valentyn_tupota

Software Engineer

1.8KПрочитань
3Автори
37Читачі
На Друкарні з 11 жовтня

Більше від автора

  • Articles

    Зміст

    Теми цього довгочиту:

    Content
  • Neural Network [guide] 1

    Все починається із першого нейрону. Алгоритм лінійної регресії для одного нейрону, та принципи його використання.

    Теми цього довгочиту:

    It
  • Frontend [TypeScript] 2

    TypeScript - Як писати код швидше та надійніше. Про неочевидні речі.

    Теми цього довгочиту:

    It

Це також може зацікавити:

  • Java. Багатопотоковість

    Java: розбір процесів та потоків, їх відмінностей, спільного використання даних та управління виконанням коду.

    Теми цього довгочиту:

    Java
  • 5 уроків, які я виніс з 2 півотів на Scrimmage

    Коли ви робите інвестиції, кожен ваш грошовий рух вимірюється і перевіряється, але коли ви робите ставки на спорт, ви покладаєтеся тільки на своє внутрішнє чуття, чому так? Чому б нам не змінити це і не дати кожному гравцю на спортивних ставках силу інвестора?

    Теми цього довгочиту:

    Стартап
  • Кібервійна в Україні так само важлива, як і битва в окопах

    Українська та російська сторони ведуть кібервійну, спрямовану на викрадення даних та сіяння паніки. Російські атаки вже давали тривожний дзвінок, вимикаючи електрику та зламуючи банки та енергетичні компанії. Україна змогла підвищити свою ефективність, але загроза залишається.

    Теми цього довгочиту:

    Війна

Коментарі (0)

Підтримайте автора першим.
Напишіть коментар!

Це також може зацікавити:

  • Java. Багатопотоковість

    Java: розбір процесів та потоків, їх відмінностей, спільного використання даних та управління виконанням коду.

    Теми цього довгочиту:

    Java
  • 5 уроків, які я виніс з 2 півотів на Scrimmage

    Коли ви робите інвестиції, кожен ваш грошовий рух вимірюється і перевіряється, але коли ви робите ставки на спорт, ви покладаєтеся тільки на своє внутрішнє чуття, чому так? Чому б нам не змінити це і не дати кожному гравцю на спортивних ставках силу інвестора?

    Теми цього довгочиту:

    Стартап
  • Кібервійна в Україні так само важлива, як і битва в окопах

    Українська та російська сторони ведуть кібервійну, спрямовану на викрадення даних та сіяння паніки. Російські атаки вже давали тривожний дзвінок, вимикаючи електрику та зламуючи банки та енергетичні компанії. Україна змогла підвищити свою ефективність, але загроза залишається.

    Теми цього довгочиту:

    Війна