Sobes.tech
Junior

Ի՞նչ է տեղի ունենում JavaScript-ում ոչ խիստ համեմատության (==) ժամանակ։

sobes.tech AI

Պատասխան AI-ից

Երբ JavaScript-ում օգտագործվում է ոչ խիստ համեմատություն (==), տիպերի փոխակերպում (coercion) կատարվում է համեմատության առաջ։ Եթե օպերանդների տիպերը տարբեր են, JavaScript-ը փորձում է փոխարկել մեկը կամ երկուսը տիպի՝ հիմնվելով մի շարք կանոնների վրա։

Հիմնական կանոնները == համար՝

  1. Թիվ և տող: Տողը փոխարկվում է թվի։ Եթե փոխարկումը չի հաջողվում (NaN), արդյունքը միշտ false է։
    // "10" փոխարկվում է 10։ Արդյունքը՝ true
    console.log(10 == "10");
    // "abc" փոխարկվում է NaN։ Արդյունքը՝ false
    console.log(10 == "abc");
    
  2. Բուլյան և ոչ-Բուլյան: Բուլյան արժեքը փոխարկվում է թվի ( true՝ 1, false՝ 0)։ Այնուհետև համեմատվում են թիվը և մյուս օպերանդը (որը կարող է փոխարկվել)։
    // true փոխարկվում է 1։ Արդյունքը՝ true
    console.log(true == 1);
    // false փոխարկվում է 0։ Արդյունքը՝ true
    console.log(false == 0);
    // false փոխարկվում է 0, "0" փոխարկվում է 0։ Արդյունքը՝ true
    console.log(false == "0");
    
  3. Null և Undefined: null համեմատվում է undefined-ի հետ որպես true, և ոչ մի այլ բանի հետ (բացի իրարից)՝ որպես true։
    // Արդյունքը՝ true
    console.log(null == undefined);
    // Արդյունքը՝ false
    console.log(null == 0);
    // Արդյունքը՝ false
    console.log(undefined == 0);
    
  4. Օբյեկտ և պրիմիտիվ: Օբյեկտը փոխարկվում է պրիմիտիվ (օգտվելով valueOf կամ toString մեթոդներից), ապա համեմատվում են պրիմիտիվները։
    // Օբյեկտը փոխարկվում է տողին "10" (միայն `toString`-ի միջոցով), ապա համեմատվում է թիվ 10-ով
    // "10" փոխարկվում է 10։ Արդյունքը՝ true
    console.log({ toString: () => "10" } == 10);
    
  5. Սիմվոլ և այլ: Սիմվոլը կարելի է համեմատել միայն մյուս սիմվոլի կամ այն պրիմիտիվ արժեքի հետ, որի հետ սիմվոլը կարող է փոխարկվել (ինչը հիմնականում անհնար է ստանդարտ դեպքերում)։
    // Արդյունքը՝ false
    console.log(Symbol('a') == 'a');
    

Ոչ խիստ համեմատությունը կարող է հանգեցնել անսպասելի արդյունքների՝ տիպերի ավտոմատ փոխարկման պատճառով։ Ավելի կանխատեսելի վարքագծի համար խորհուրդ է տրվում օգտագործել խիստ համեմատություն (===), որը չի կատարում տիպերի փոխարկում և համեմատում է օպերանդները ուղղակի։