Junior
JavaScript-ში რა ხდება არასკაცრო შედარების (==) დროს?
sobes.tech AI
პასუხი AI-სგან
JavaScript-те ոչ խիստ համեմատությունը (==) կատարվում է տիպերի փոխակերպում (coercion) նախքան համեմատությունը։ Եթե օպերանդների տիպերը տարբեր են, JavaScript-ը փորձում է փոխարկել մեկը կամ երկուսը մեկ տիպի՝ մի շարք կանոնների հիման վրա։
==-ի հիմնական կանոնները՝
- Թիվ և տող: Տողը փոխարկվում է թվի։ Եթե փոխարկումը չի հաջողվում (NaN), արդյունքը միշտ
falseէ։// "10" փոխարկվում է 10։ Արդյունքը՝ true console.log(10 == "10"); // "abc" փոխարկվում է NaN։ Արդյունքը՝ false console.log(10 == "abc"); - Բուլյան և ոչ-Բուլյան: Բուլյան արժեքը փոխարկվում է թվի (
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"); - Null և Undefined:
nullհամեմատվում էundefined-ի հետ որպեսtrue, և ոչ մի այլ բանի հետ (բացի իրարից)՝ որպեսtrue։// Արդյունքը՝ true console.log(null == undefined); // Արդյունքը՝ false console.log(null == 0); // Արդյունքը՝ false console.log(undefined == 0); - Օբյեկտ և պրիմիտիվ: Օբյեկտը փոխարկվում է պրիմիտիվ (օգտվելով
valueOfկամtoStringմեթոդներից), ապա համեմատվում են պրիմիտիվները։// Օբյեկտը փոխարկվում է տողին "10" (միայն `toString`-ի միջոցով), ապա համեմատվում է թիվ 10-ով // "10" փոխարկվում է 10։ Արդյունքը՝ true console.log({ toString: () => "10" } == 10); - Սիմվոլ և այլ: Սիմվոլը կարելի է համեմատել միայն մյուս սիմվոլի կամ այն պրիմիտիվ արժեքի հետ, որի հետ սիմվոլը կարող է փոխարկվել (ինչը հիմնականում անհնար է ստանդարտ դեպքերում)։
// Արդյունքը՝ false console.log(Symbol('a') == 'a');
Ոչ խիստ համեմատությունը կարող է հանգեցնել անսպասելի արդյունքների՝ տիպերի ավտոմատ փոխարկման պատճառով։ Ավելի կանխատեսելի վարքագծի համար խորհուրդ է տրվում օգտագործել խիստ համեմատություն (===), որը չի կատարում տիպերի փոխարկում և համեմատում է օպերանդները ուղղակի։