Nima uchun men bir vaqtning o'zida 3ta qatorni taqqoslay olmayman?

a , b va c deb nomlangan 3 ta ketma-ketlik bor.

Men ularni bir xil indekslarning bir xil qiymatga ega ekanligini tekshirish uchun solishtirayapman.

Agar bu kabi taqqoslansa, u ishlamaydi.

 for (var i = 0; i < 3; i++) {
    if (a[i] === b[i] === c[i]) {
     console.log("Matched")
    }
 }

Ammo men buni yoqtirsa, u ishlaydi.

for (var i = 0; i < 3; i++) {
   if (a[i] === b[i] && a[i] === c[i] && b[i] === c[i]) {
      console.log("Matched")
    }
 }

Xo'sh, nima uchun?

JSBIN

1
chunki JavaScript nima qilayotganingizni bilmaydi. Amaliyot tartibida a [i] === (b [i] === c [i]) ni bajaradi. Shuning uchun a [i] === true | false hisoblanadi
qo'shib qo'ydi muallif epascarello, manba
@epascarello, yo'q, iltimos, rost === 1 === 1 ni tekshiring. haqiqiy ifoda (a [i] === b [i]) == c [i] ga o'xshaydi.
qo'shib qo'ydi muallif Nina Scholz, manba
agar a [i] === b [i] && a [i] === c [i] bo'lsa, u holda b [i] === c [i] Sinov har doim to'g'ri va keraksiz bo'ladi, uni olib tashlashingiz mumkin.
qo'shib qo'ydi muallif Eineki, manba
Chunki a [i] === b [i] === c [i] sizning fikringizni bajarmasa, a [i] === b [i] === c [i]) dan foydalaning
qo'shib qo'ydi muallif Matteo Tassinari, manba
Bir qator qiymatiga (haqiqiy/noto'g'ri) bir qator qiymati solishtirish bo'yicha barcha javoblar texnik jihatdan to'g'ri. Biroq JavaScript tarjimonining kodni nikohga olishlari va tegishli operatsiyalar tartibini baholash uchun ularni muntazam ifodalar orqali ishlashlari kerakligini ham eslatib o'tish kerak. Tarjimon va kompilyatorlarni o'rganmasdan, nima uchun bu haqiqatni tushunib bo'lmaydi? = C [i].
qo'shib qo'ydi muallif Paul, manba

8 javoblar

Something interesting happens when you remove one = from the ===

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

a=[1,2,3],b=[1,2,3],c=[1,2,3];

    for (var i = 0; i < 3; i++) {
        if (a[i] == b[i] == c[i]) {
         console.log("Matched")
        }
    }

    //Matched
</div> </div>

Ishlamoqda! Lekin nega? Buning sababi javascriptda == va === o'rtasida farq bor.

=== bilan aniq bo'lishi kerak. Boshqa javoblar kabi: a [i] === (b [i] === c [i]) , keyin esa a [i] === rost yoki false bo'lishi kerakligini anglatadi, yoki faqat false .

Agar siz == dan foydalansangiz, u holda aniq bo'lishi shart emas, faqat haqiqiy yoki false haqiqat yoki falsy .

Note: I don't advise to use the method with == in this case as this is only to make a point. It's best to separate them out and use ===. If you try other combinations you will notice matches on arrays that shouldn't match. That's because they are matching truthy

Ushbu kodni ko'ring:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

a=[0,5,7],b=[1,3,8],c=[0,2,9];

    for (var i = 0; i < 3; i++) {
        if (a[i] == b[i] == c[i]) {
         console.log("Matched")
        }
    }
</div> </div>

Xo'sh, agar ular hamma narsa rost bo'lsa va siz === ishlatgan bo'lsangiz? U ham mos keladi.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

a=[true],b=[true],c=[true];

    for (var i = 0; i < 3; i++) {
        if (a[i] === b[i] === c[i]) {
         console.log("Matched")
        }
    }
</div> </div>
4
qo'shib qo'ydi
ammo a, b va c esa [0,1,2] bo'lsa, o'yin bo'lmaydi! A = [0,1,2] va b = [1,1,2] va c = [0,1,2] teng massa sifatida baholanadi!
qo'shib qo'ydi muallif Eineki, manba
@Turnipdabeetsni qidiryapsizmi? My brauzerda 0 == 0 rost va 0 == rost to'g'ri emas va (0 == 0 == 0) noto'g'ri deb baholanadi va (1 == 0 == 0) haqiqiy deb aytsa. (Firefox)
qo'shib qo'ydi muallif Eineki, manba
@Turnipdabeetsni noto'g'ri tushunmang, faqat taqqoslash operatorini o'zgartirishi mumkin bo'lgan xatoga ishora qilish uchun javobingizni qadrlayman. Men faqat bir necha ishni ko'rsatishni taklif qildim. [Aytgancha, mos keladigan mag'lubiyat to'liq tuzilmalarda emas, qatorning yagona indeks qiymati, bu xatti-harakatlar aniqroq bo'ladi]
qo'shib qo'ydi muallif Eineki, manba
@Eineki hammasi [0,1,2] bo'lsa, u ham xuddi shunday. Lekin, ha, bu o'yinning eng yaxshi usuli emas, chunki siz aytgan so'zlaringizdagi kabi xatolar bo'ladi.
qo'shib qo'ydi muallif Turnipdabeets, manba
@Eineki tuzatib turdi!
qo'shib qo'ydi muallif Turnipdabeets, manba

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

a=[1,2,3],b=[1,2,3],c=[1,2,3];
for (var i = 0; i < 3; i++) {
    if (a[i] === b[i] === c[i]) {
     console.log("Matched")
    }
    else{
      console.log("error");
    }
 }
</div> </div>

Explain : a[i] === b[i]//return boolean true or false

true|false === c[i] is false

Kodni tekshiring. Boshqa qismi ishlayotganini ko'rishingiz mumkin.

Quyidagi kodni tekshiring

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

a=true,b=true,c=true;
if(a === b === c){
  console.log(a);
}
</div> </div>
3
qo'shib qo'ydi

Siz tarjima qilayotgan boolean mantiq bunday ishlamaydi. Sizning dastlabki fikringiz quyidagicha tavsiflanadi: (a [i] === b [i]) === c [i] . Shuning uchun yangi ishchi!

2
qo'shib qo'ydi

Chunki .... boolean mantiq ishlaydi.

Aytgancha, agar bo'lsa, unda keraksiz tekshiruvingiz bor. .

if a==b and b==c then, by definition a==c

2
qo'shib qo'ydi

kodingizda:

a[i] === b[i] will execute first

Boolean qiymati qaytaradi. keyin bu kabi boolean qiymatini c ga tenglashtiring

haqiqiy === s

Albatta, bu yolg'ondir

Siz shuni yozing, buni yaxshiroq tushunasiz:

(a[i] === b[i])=== c[i]
2
qo'shib qo'ydi

Chunki a [i] === b [i] === c [i] siz nima deb o'ylaysiz, qilmaydi:

(a [i] === b [i]) === c [i]

keyin esa birinchi taqqoslash natijasiga asoslangan true === c [i] yoki false === c [i] ga aylanadi.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var a = [1, 2, 3];
var b = [1, 2, 3];
var c = [1, true, 3];

for (var i = 0; i < 2; ++i) {
  if (a[i] === b[i] === c[i]) {
    console.log('Match found at index: ' + i);
  }
}
</div> </div>
2
qo'shib qo'ydi

U birinchi qismni taqqoslaganda, qiymat keyingi qism bilan taqqoslanadi. Birinchi qism uchun ichki braketdan foydalanib ko'ring. Yoki siz ikkinchi misolda qilganingiz kabi qilavering.

2
qo'shib qo'ydi

Shunga o'xshash narsa:

    (a[i]===(b[i]===c[i]))
    ((a[i]===b[i])===c[i])
1
qo'shib qo'ydi
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb