(a== 1 && a ==2 && a==3) hiç doğru olarak değerlendirilebilir mi?

Moderatör notu: Lütfen kodu düzenleme veya bu uyarıyı kaldırma dürtüsüne direnin. Boşluk kalıbı sorunun bir parçası olabilir ve bu nedenle gereksiz yere kurcalanmamalıdır. Eğer "whitespace önemsizdir" kampındaysanız, kodu olduğu gibi kabul edebilmelisiniz.

JavaScript'te (a== 1 && a ==2 && a==3) ifadesinin true olarak değerlendirilmesi mümkün müdür?

Bu, büyük bir teknoloji şirketi tarafından sorulan bir mülakat sorusudur. İki hafta önce oldu, ama hala cevabı bulmaya çalışıyorum. Günlük işlerimizde asla böyle bir kod yazmadığımızı biliyorum ama merak ediyorum.

Çözüm

Eğer how == works avantajından faydalanırsanız, her kullanıldığında döndürdüğü değeri değiştiren özel bir toString (veya valueOf) fonksiyonuna sahip bir nesne oluşturabilirsiniz, böylece her üç koşulu da yerine getirmiş olursunuz.

const a = {
  i: 1,
  toString: function () {
    return a.i++;
  }
}

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

Bunun işe yaramasının nedeni, gevşek eşitlik operatörünün kullanılmasıdır. Gevşek eşitlik kullanıldığında, işlenenlerden biri diğerinden farklı bir türdeyse, motor birini diğerine dönüştürmeye çalışacaktır. Solda bir nesne ve sağda bir sayı olması durumunda, çağrılabilirse önce valueOf öğesini çağırarak nesneyi bir sayıya dönüştürmeye çalışacak ve bu yapılamazsa toString öğesini çağıracaktır. Bu durumda toString kullandım çünkü aklıma gelen buydu, valueOf daha mantıklı olurdu. Bunun yerine toStringden bir dize döndürseydim, motor daha sonra dizeyi bir sayıya dönüştürmeye çalışacak ve bize aynı sonucu verecekti, ancak biraz daha uzun bir yolla.

Yorumlar (19)

BU MÜMKÜN!

var i = 0;

with({
  get a() {
    return ++i;
  }
}) {
  if (a == 1 && a == 2 && a == 3)
    console.log("wohoo");
}

Bu, anın üç farklı değere değerlendirilmesine izin vermek için bir with deyiminin içinde bir getter kullanır.

... bu yine de bunun gerçek kodda kullanılması gerektiği anlamına gelmez...

Daha da kötüsü, bu numara === kullanımı ile de çalışacaktır.

  var i = 0;

  with({
    get a() {
      return ++i;
    }
  }) {
    if (a !== a)
      console.log("yep, this is printed.");
  }
Yorumlar (12)

Bu, global kapsamda aşağıdakiler kullanılarak gerçekleştirilebilir. Aşağıdaki kodda nodejs için window yerine global kullanın.

var val = 0;
Object.defineProperty(window, 'a', {
  get: function() {
    return ++val;
  }
});
if (a == 1 && a == 2 && a == 3) {
  console.log('yay');
}

Bu yanıt, değişkeni almak için bir getter tanımlayarak yürütme bağlamında global kapsam tarafından sağlanan örtük değişkenleri kötüye kullanır.

Yorumlar (6)