Автоматично преобразуване на типове данни
Както вече знаете, низовете в JavaScript трябва да се поставят в кавички. Може да се случи всичките символи на низа да са цифри:
let a = '123';
В този случай променливата a също е
низ, но с определен нюанс.
Същността на нюанса е следната: ако върху низ с цифри се извърши някаква математическа операция - тази операция ще бъде изпълнена така, сякаш наистина имаме числа, а не низове:
alert('2' * '3'); // ще изведе 6
В този случай JavaScript вижда, че се опитваме да изпълним недопустима за низове, но допустима за числа операция.
Той също така вижда, че всъщност нашите низове - това са числа в кавички. Затова JavaScript автоматично извършва преобразуване на тези низове към числа и изпълнява съответната математическа операция върху тях.
Това работи, ако в нашите низове има само
цифри. Ако там има дори една буква
- JavaScript ще счита операцията за некоректна
и ще направи резултата ѝ стойност NaN:
alert('2' * '3s'); // ще изведе NaN
Освен това, автоматичното преобразуване се случва, ако операцията е математически коректна, но недопустима за низове.
Например, низове не могат (а числа могат) да се умножават, делят, изваждат, затова във всички такива операции ще има автоматично преобразуване на низове с цифри към числа.
Обаче, низовете, както и числата, се събират
с помощта на оператора +. Това означава,
че в случай на събиране няма да има автоматично преобразуване:
let a = '1' + '2';
alert(a); // ще изведе '12' - получи се събиране на низове
Ако едно от събираемите е число, а другото - низ, то винаги печели низът:
let a = 1 + '2';
alert(a); // ще изведе '12'
В такива случаи JavaScript, обратно, автоматично преобразува числата в низове и извършва събиране на низове.
Има, обаче, нюанси, когато събираемите са повече от две: в този случай преобразуването към определен тип зависи от реда на изпълнение на операциите.
В следващия пример първо 2 и 3
ще се съберат като числа, а след това резултатът ще се прибави
към низа '1' вече като низ '5',
което в крайна сметка ще даде низа '15':
let a = '1' + (2 + 3);
alert(a); // ще изведе '15'
Ако се махнат скобите, всичко ще се събира
отляво надясно. Тоест първо към низа '1'
ще се прибави числото 2 и в резултат
ще се получи низът '12'. След това към този
низ ще се прибави числото 3 и в резултат
ще се получи низът '123':
let a = '1' + 2 + 3;
alert(a); // ще изведе '123'
А ето в следващия пример числата 2
и 3 са написани в началото, затова първо
те ще се съберат като числа, давайки в резултат
числото 5, а след това към това число ще се прибави
низът '1', давайки в крайна сметка низа '51':
let a = 2 + 3 + '1';
alert(a); // ще изведе '51'
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' + '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' + 2;
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = 5 + '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = 5 + 2;
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' * '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' - '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' / '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' % '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5s' * '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5s' + '2';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = (-'5') + (-'2');
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' * 1 + '2' * 1;
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '5' * '1' + '2' * '1';
alert(a);
Без да пускате кода, определете какво ще се изведе на екрана:
let a = '' + 3 + 1;
alert(a);