ტიპების ავტომატური გარდაქმნა
როგორც უკვე იცით, სტრიქონები 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);