(A == 1 && a == 2 && a == 3) hi├ž do─čru olarak de─čerlendirilebilir mi?


Al─▒nan cevaba git


Moderat├Âr notu: L├╝tfen kodu d├╝zenleme veya bu bildirimi kald─▒rma d├╝rt├╝s├╝ne diren. Bo┼čluk d├╝zeni sorunun bir par├žas─▒ olabilir ve bu nedenle gereksiz yere de─či┼čtirilmemelidir. "Bo┼čluk ├Ânemsiz" kamp─▒ndaysan─▒z, kodu oldu─ču gibi kabul edebilmelisiniz.

O m├╝mk├╝n zamankinden mi (a== 1 && a ==2 && a==3) olarak de─čerlendirilebilir true JavaScript?

Bu, b├╝y├╝k bir teknoloji ┼čirketi taraf─▒ndan sorulan bir r├Âportaj sorusu. ─░ki hafta ├Ânce oldu, ama hala cevab─▒ bulmaya ├žal─▒┼č─▒yorum. G├╝nl├╝k i┼čimizde b├Âyle bir kod asla yazmad─▒─č─▒m─▒z─▒ biliyorum, ama merak ediyorum.


2430









Cevap say─▒s─▒n─▒ say: 26






Nas─▒l == ├žal─▒┼čt─▒─č─▒ndan faydalan─▒rsan─▒z, yaln─▒zca her kullan─▒ld─▒─č─▒nda d├Ând├╝rd├╝─č├╝ ┼čeyi de─či┼čtiren, her ├╝├ž ko┼čulu da kar┼č─▒layacak ┼čekilde de─či┼čtiren ├Âzel toString (veya valueOf ) i┼člevli bir nesne olu┼čturabilirsiniz .

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

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


Bunun ├žal─▒┼čmas─▒n─▒n nedeni, serbest 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─▒┼č─▒r. Solda bir nesne ve sa─čda bir say─▒ valueOf olmas─▒ durumunda, ├ža─čr─▒labilirse ilk ├Ânce ├ža─č─▒rarak nesneyi bir say─▒ya d├Ân├╝┼čt├╝rmeye ├žal─▒┼č─▒r ve ba┼čar─▒s─▒z olursa onu ├ža─č─▒r─▒r toString . toString Bu davada kulland─▒m , ├ž├╝nk├╝ akl─▒ma bu geldi, valueOf daha mant─▒kl─▒ olacakt─▒. Bunun yerine bir dize d├Ând├╝r├╝rsem toString , motor daha sonra, biraz daha uzun bir yol olsa da, dizgiyi bize ayn─▒ son sonucu veren bir say─▒ya d├Ân├╝┼čt├╝rmeye ├žal─▒┼č─▒rd─▒.


3275







Kar┼č─▒ koyamad─▒m - di─čer cevaplar ┼č├╝phesiz do─črudur, ancak ger├žekten a┼ča─č─▒daki kodu ge├žemezsiniz:

 var a´żá = 1;
var a = 2;
var ´żáa = 3;
if(a´żá==1 && a== 2 &&´żáa==3) {
    console.log("Why hello there!")
} 

─░fadedeki tuhaf bo┼člu─ča if dikkat edin (sorunuzdan kopyalad─▒m). ECMA beti─či taraf─▒ndan bir bo┼čluk karakteri olarak yorumlanmayan bir Unicode bo┼čluk karakteri olan yar─▒ geni┼člikte Hangul'dur (tan─▒d─▒k olmayanlar i├žin Korece olan) - bu, tan─▒mlay─▒c─▒ i├žin ge├žerli bir karakter oldu─ču anlam─▒na gelir. Bu nedenle, biri a'dan sonra Hangul'la, biri daha ├Ânce ve sonunu da sadece a ile olmak ├╝zere ├╝├ž farkl─▒ de─či┼čken var. Bo┼čluk _ okunabilirlikle de─či┼čtirilirse, ayn─▒ kod ┼č├Âyle g├Âr├╝n├╝r:

 var a_ = 1;
var a = 2;
var _a = 3;
if(a_==1 && a== 2 &&_a==3) {
    console.log("Why hello there!")
} 

Mathias'─▒n de─či┼čken ad─▒ do─črulay─▒c─▒s─▒n─▒n do─črulamas─▒na g├Âz at─▒n . Bu garip bo┼čluk asl─▒nda sorular─▒na dahil edildiyse, bu t├╝r bir cevap i├žin bir ipucu oldu─čundan eminim.

Bunu yapma Ciddi anlamda.

D├╝zenleme: S─▒f─▒r geni┼člikli marangoz ve S─▒f─▒r geni┼člikli marangoz olmayan karakterlerin de─či┼čken isimlerde de kullan─▒lmas─▒na izin verildi─čine dikkat ├žekti - bkz. S─▒f─▒r geni┼člikli karakterlerle JavaScript'i engelleme ? .

Bu, a┼ča─č─▒dakine benzer:

 var a= 1;
var aÔÇŹ= 2; //one zero-width character
var aÔÇŹÔÇŹ= 3; //two zero-width characters (or you can use the other one)
if(a==1&&aÔÇŹ==2&&aÔÇŹÔÇŹ==3) {
    console.log("Why hello there!")
} 


2030


2018-01-16





BU M├ťMK├ťN!

 var i = 0;

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

Bu, ├╝├ž farkl─▒ de─čere de─čerlendirmek i├žin bir with ifadenin i├žindeki bir al─▒c─▒ kullan─▒r a .

... bu hala ger├žek kodda kullan─▒lmas─▒ gerekti─či anlam─▒na gelmiyor ...

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.");
  } 


607







Al─▒c─▒lar veya valueOf olmadan ├Ârnek:

 a = [1,2,3];
a.join = a.shift;
console.log(a == 1 && a == 2 && a == 3); 

Bu ├žal─▒┼čmalar nedeniyle == ├ža─č─▒r─▒r toString hangi aramalar .join Diziler i├žin.

Symbol.toPrimitive ES6'ya e┼čde─čer olan ba┼čka bir ├ž├Âz├╝m toString/valueOf :

 let i = 0;
let a = { [Symbol.toPrimitive]: () => ++i };

console.log(a == 1 && a == 2 && a == 3); 


498







M├╝mk├╝n olup olmad─▒─č─▒ sorulursa (ZORUNLU de─čil), rastgele bir say─▒ d├Ând├╝rmek i├žin "a" isteyebilir. S─▒rayla 1, 2 ve 3 ├╝retirse do─čru olur.

 with({
  get a() {
    return Math.floor(Math.random()*4);
  }
}){
  for(var i=0;i<1000;i++){
    if (a == 1 && a == 2 && a == 3){
      console.log("after " + (i+1) + " trials, it becomes true finally!!!");
      break;
    }
  }
} 


264







Normal ifadeler olmadan hi├žbir ┼čey yapamad─▒─č─▒n─▒zda:

 var a = {
  r: /\d/g, 
  valueOf: function(){
    return this.r.exec(123)[0]
  }
}

if (a == 1 && a == 2 && a == 3) {
    console.log("!")
} 

valueOf Object ilkel ile kar┼č─▒la┼čt─▒r─▒ld─▒─č─▒nda (Number gibi) ├ža─čr─▒lan ├Âzel y├Ântem nedeniyle ├žal─▒┼č─▒r . As─▒l p├╝f noktas─▒, a.valueOf her zaman yeni bir de─čer d├Ând├╝r├╝r , ├ž├╝nk├╝ bayrakla exec birlikte d├╝zenli ifadeyi ├ža─č─▒r─▒r g , bu lastIndex da normal ifadenin her seferinde e┼čle┼čmesinin bulunmas─▒na neden olur . Yani ilk kez this.r.lastIndex == 0 , e┼čle┼čir 1 ve g├╝ncelle┼čtirir lastIndex :, this.r.lastIndex == 1 b├Âylece bir dahaki sefere regex 2 ve benzeri e┼čle┼čecek .


208


2018-01-16





Bu, de─či┼čken a taraf─▒ndan eri┼čilmesi durumunda m├╝mk├╝nd├╝r , ├Ârne─čin bir web yaz─▒c─▒s─▒n─▒ SharedArrayBuffer ve baz─▒ ana komut dosyalar─▒ yoluyla yapabilirsiniz. Olas─▒l─▒k d├╝┼č├╝kt├╝r, ancak kod makine koduna derlenmi┼č zaman, web i┼č├žileri de─či┼čkeni g├╝ncellemek m├╝mk├╝nd├╝r a sadece ┼čartlarda bu y├╝zden zaman─▒nda a==1 , a==2 ve a==3 ko┼čullar sa─član─▒r.

Bu, web ├žal─▒┼čanlar─▒ ve JavaScript'teki SharedArrayBuffer taraf─▒ndan sa─članan ├žok i┼č par├žac─▒kl─▒ ortamda yar─▒┼č ko┼čulunun bir ├Ârne─či olabilir.

─░┼čte yukar─▒dakilerin temel uygulamas─▒:

main.js

 // Main Thread

const worker = new Worker('worker.js')
const modifiers = [new Worker('modifier.js'), new Worker('modifier.js')] // Let's use 2 workers
const sab = new SharedArrayBuffer(1)

modifiers.forEach(m => m.postMessage(sab))
worker.postMessage(sab)
 

worker.js

 let array

Object.defineProperty(self, 'a', {
  get() {
    return array[0]
  }
});

addEventListener('message', ({data}) => {
    array = new Uint8Array(data)
    let count = 0
    do {
        var res = a == 1 && a == 2 && a == 3
        ++count
    } while(res == false) // just for clarity. !res is fine
    console.log(`It happened after ${count} iterations`)
    console.log('You should\'ve never seen this')
})
 

modifier.js

 addEventListener('message' , ({data}) => {
    setInterval( () => {
        new Uint8Array(data)[0] = Math.floor(Math.random()*3) + 1
    })
})
 

MacBook AirÔÇÖde ilk denemede yakla┼č─▒k 10 milyar yinelemeden sonra ger├žekle┼čiyor:


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

─░kinci deneme:


g├Âr├╝nt├╝ tan─▒m─▒n─▒ buraya girin

Dedi─čim gibi, ┼čans d├╝┼č├╝k olacak, ancak yeterince zaman verildi─činde, duruma ├žarpacak.

─░pucu: Sisteminizde ├žok uzun s├╝rerse. Sadece deneyin a == 1 && a == 2 ve de─či┼čtirmek Math.random()*3 i├žin Math.random()*2 . Listeye gittik├že daha fazla ekleme isabet ┼čans─▒n─▒ d├╝┼č├╝r├╝r.


190







Global kapsamda a┼ča─č─▒dakiler kullan─▒larak ger├žekle┼čtirilebilir. ─░├žin nodejs kullan─▒m global yerine window a┼ča─č─▒daki kodu.

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

Bu cevap, de─či┼čkeni almak i├žin bir al─▒c─▒ tan─▒mlayarak y├╝r├╝tme ba─člam─▒nda global kapsam taraf─▒ndan sa─članan ├Ârt├╝k de─či┼čkenleri k├Ât├╝ye kullan─▒r.


188







Bu, bir dizi kendi kendine yaz─▒lan al─▒c─▒lar kullanarak da m├╝mk├╝nd├╝r:

(Bu jontro'nun ├ž├Âz├╝m├╝ne benzer, ancak bir saya├ž de─či┼čkeni gerektirmez.)

 (() => {
    "use strict";
    Object.defineProperty(this, "a", {
        "get": () => {
            Object.defineProperty(this, "a", {
                "get": () => {
                    Object.defineProperty(this, "a", {
                        "get": () => {
                            return 3;
                        }
                    });
                    return 2;
                },
                configurable: true
            });
            return 1;
        },
        configurable: true
    });
    if (a == 1 && a == 2 && a == 3) {
        document.body.append("Yes, itÔÇÖs possible.");
    }
})(); 


146







Bu cevab─▒n zaten yay─▒nlanm─▒┼č oldu─čunu g├Ârm├╝yorum, bu y├╝zden bunu da kar─▒┼č─▒ma ataca─č─▒m. Bu, Jeff'in yar─▒ geni┼člikte Hangul alan─▒yla yan─▒t─▒na benzer .

 var a = 1;
var ´Żü = 2;
var đ░ = 3;
if(a == 1 && ´Żü == 2 && đ░ == 3) {
    console.log("Why hello there!")
} 

─░kincisi ile hafif bir tutars─▒zl─▒k fark edebilirsiniz, ancak birinci ve ├╝├ž├╝nc├╝s├╝ ├ž─▒plak g├Âzle ayn─▒d─▒r. Her 3 ayr─▒ karakterdir:

a - Latin k├╝├ž├╝k harf A
´Żü - Tam Geni┼člikte Latin k├╝├ž├╝k harf A
đ░ - Kiril k├╝├ž├╝k harf A

Bunun i├žin genel terim "homoglif" dir: ayn─▒ g├Âr├╝nen farkl─▒ unicode karakterler. Tamamen ay─▒rt edilemez ├╝├ž elde etmek zor , ancak baz─▒ durumlarda ┼čansl─▒ olabilirsiniz. A, ╬Ĺ, đÉ ve ßĬ daha iyi ├žal─▒┼čacak (Latince-A, Yunan Alpha , Kiril-A ve Cherokee-A ; s─▒ras─▒yla maalesef Rum ve Cherokee k├╝├ž├╝k harfler Latin ├žok farkl─▒d─▒r a : ╬▒ , ŕş║ ve doesn b├Âylece Yukar─▒daki snippet ile yard─▒mc─▒ olmuyor)

Orada en yayg─▒n olarak sahte alan adlar─▒nda (├Ârn. wikipediđ░.org (Kiril) vs wikipedia.org (Latin)) t├╝m Homoglif Sald─▒r─▒lar─▒ s─▒n─▒f─▒ vard─▒r , ancak kodda da g├Âsterilebilir; tipik olarak desteklenme olarak adland─▒r─▒l─▒r (bir yorumda belirtildi─či gibi, [desteklenmedik] sorular PPCG'de art─▒k konu d─▒┼č─▒d─▒r , ancak bu t├╝r ┼čeylerin ortaya ├ž─▒kaca─č─▒ bir t├╝r zorluk olarak kullan─▒l─▒r). Kulland─▒─č─▒m bu web sitesini Bu yan─▒t i├žin kullan─▒lan homoglyphs bulmak i├žin.


129







Alternatif olarak, bunun i├žin bir s─▒n─▒f ve kontrol i├žin bir ├Ârnek kullanabilirsiniz.

 function A() {
    var value = 0;
    this.valueOf = function () { return ++value; };
}

var a = new A;

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

D├ťZENLE

ES6 s─▒n─▒flar─▒n─▒ kullanarak bu gibi g├Âr├╝n├╝yor

 class A {
  constructor() {
    this.value = 0;
    this.valueOf();
  }
  valueOf() {
    return this.value++;
  };
}

let a = new A;

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


128







Evet m├╝mk├╝n! ?

┬╗JavaScript

 ifÔÇî=()=>!0;
var a = 9;

ifÔÇî(a==1 && a== 2 && a==3)
{
    document.write("<h1>Yes, it is possible!?</h1>")
} 

Yukar─▒daki kod k─▒sa bir versiyondur (yorumlardaki notu i├žin @Forivin sayesinde) ve a┼ča─č─▒daki kod orijinaldir:

 var a = 9;

ifÔÇî(a==1 && a== 2 && a==3)
{
    //console.log("Yes, it is possible!?")
    document.write("<h1>Yes, it is possible!?</h1>")
}

//--------------------------------------------

function ifÔÇî(){return true;} 

Kodumun sadece ├╝st taraf─▒n─▒ g├Âr├╝r ve ├žal─▒┼čt─▒r─▒rsan─▒z WOW diyorsunuz, nas─▒l?

Bu y├╝zden, evet demek yeterli oldu─čunu d├╝┼č├╝n├╝yorum , size s├Âyleyen biri i├žin m├╝mk├╝nd├╝r : Hi├žbir ┼čey imkans─▒z de─čildir.

Hile: Sonra if ismine benzer bir fonksiyon yapmak i├žin gizli bir karakter kulland─▒m if . JavaScriptÔÇÖte, anahtar kelimeleri ge├žersiz k─▒lmayaca─č─▒m─▒z i├žin, bu ┼čekilde kullanmak zorunda kald─▒m. Sahte if , ama bu durumda senin i├žin ├žal─▒┼č─▒yor!


┬╗ C #

Ayr─▒ca bir C # s├╝r├╝m├╝ yazd─▒m ( ├Âzellik de─čerini art─▒rma tekni─či ile ):

 static int _a;
public static int a => ++_a;

public static void Main()
{
    if(a==1 && a==2 && a==3)
    {
        Console.WriteLine("Yes, it is possible!?");
    }
}
 

Canl─▒ Demo


103


2018-01-21





JavaScript

a == a +1

JavaScript'te, tamsay─▒lar de─čil, yaln─▒zca Number ├žift ÔÇőÔÇőduyarl─▒kl─▒ kayan nokta say─▒lar─▒ olarak uygulanan s'ler vard─▒r.

Bir Say─▒ a yeterince b├╝y├╝kse, ard─▒┼č─▒k ├╝├ž tam say─▒ya e┼čit olarak kabul edilebilece─či anlam─▒na gelir :

 a = 100000000000000000
if (a == a+1 && a == a+2 && a == a+3){
  console.log("Precision loss!");
} 

Do─čru, g├Âr├╝┼čmecinin istedi─či tam olarak bu de─čil (birlikte ├žal─▒┼čmaz a=0 ), ancak gizli i┼člevler veya operat├Âr├╝n a┼č─▒r─▒ y├╝klenmesi ile ilgili herhangi bir numara i├žermez.

Di─čer diller

Ba┼čvuru i├žin, a==1 && a==2 && a==3 Ruby ve Python'da ├ž├Âz├╝mler var . K├╝├ž├╝k bir de─či┼čiklikle, Java'da da m├╝mk├╝nd├╝r.

Yakut

Bir ├Âzel ile == :

 class A
  def ==(o)
    true
  end
end

a = A.new

if a == 1 && a == 2 && a == 3
  puts "Don't do this!"
end
 

Ya da artan a :

 def a
  @a ||= 0
  @a += 1
end

if a == 1 && a == 2 && a == 3
  puts "Don't do this!"
end
 

piton

 class A:
    def __eq__(self, who_cares):
        return True
a = A()

if a == 1 and a == 2 and a == 3:
    print("Don't do that!")
 

Java

Java Integer ├Ânbelle─čini de─či┼čtirmek m├╝mk├╝nd├╝r :

 package stackoverflow;

import java.lang.reflect.Field;

public class IntegerMess
{
    public static void main(String[] args) throws Exception {
        Field valueField = Integer.class.getDeclaredField("value");
        valueField.setAccessible(true);
        valueField.setInt(1, valueField.getInt(42));
        valueField.setInt(2, valueField.getInt(42));
        valueField.setInt(3, valueField.getInt(42));
        valueField.setAccessible(false);

        Integer a = 42;

        if (a.equals(1) && a.equals(2) && a.equals(3)) {
            System.out.println("Bad idea.");
        }
    }
}
 

96







Bu bir ters versiyonudur Jeff'in cevab─▒ @ gizli karakteri (U + 115F, U + 1160 veya U + 3164) gibi o bak─▒┼č de─či┼čkenleri olu┼čturmak i├žin kullan─▒l─▒r * 1 , 2 ve 3 .

 var  a = 1;
var ´żá1 = a;
var ´żá2 = a;
var ´żá3 = a;
console.log( a ==´żá1 && a ==´żá2 && a ==´żá3 ); 

* Bu cevap s─▒f─▒r geni┼člikte marangozluk olmayan (U + 200C) ve s─▒f─▒r geni┼člikli marangoz (U + 200D) kullan─▒larak basitle┼čtirilebilir. Bu karakterlerin her ikisine de tan─▒mlay─▒c─▒lar─▒n i├žinde izin verilir, ancak ba┼člang─▒├žta:

 var a = 1;
var aÔÇî = 2;
var aÔÇŹ = 3;
console.log(a == 1 && aÔÇî == 2 && aÔÇŹ == 3);

/****
var a = 1;
var a\u200c = 2;
var a\u200d = 3;
console.log(a == 1 && a\u200c == 2 && a\u200d == 3);
****/ 

Ayn─▒ fikri kullanarak ba┼čka numaralar da m├╝mk├╝nd├╝r; ├Ârne─čin, tam olarak birbirine benzeyen de─či┼čkenler olu┼čturmak i├žin Unicode varyasyon se├žicileri kullanarak ( a´ŞÇ = 1; a´Şü = 2; a´ŞÇ == 1 && a´Şü == 2; // true ).


79







G├Âr├╝┼čmelerden biri olan kural; asla imkans─▒z deme.

Gizli karakter kand─▒rmas─▒na gerek yok.

 window.__defineGetter__( 'a', function(){
    if( typeof i !== 'number' ){
        // define i in the global namespace so that it's not lost after this function runs
        i = 0;
    }
    return ++i;
});

if( a == 1 && a == 2 && a == 3 ){
    alert( 'Oh dear, what have we done?' );
} 


73







D├╝r├╝st olmak gerekirse, bunun do─čru olup olmad─▒─č─▒n─▒ de─čerlendirmenin bir yolu olup olmad─▒─č─▒ (ve di─čerlerinin de g├Âsterdi─či gibi, ├žok say─▒da yolu vard─▒r), arad─▒─č─▒m cevap, y├╝zlerce g├Âr├╝┼čme yapm─▒┼č biri olarak konu┼čma olacakt─▒r. ├žizgileri boyunca bir ┼čey:

ÔÇťEvet, belki evet, benim i├žin hemen belli olmayan baz─▒ garip ko┼čullar alt─▒nda ... ama bunu ger├žek kodla kar┼č─▒la┼čt─▒ysam, ne yapt─▒─č─▒n─▒ ve neden yapt─▒─č─▒n─▒ anlamak i├žin ortak hata ay─▒klama tekniklerini kullan─▒rd─▒m. ve sonra derhal bu durumu ├Ânlemek i├žin kodu tekrar g├Âzden ge├žirin ... ama daha da ├Ânemlisi: bu kodu ilk etapta kesinlikle ASLA yazmam ├ž├╝nk├╝ bu, i├ž i├že ge├žmi┼č kodun tan─▒m─▒d─▒r ve asla i├žindekiler kodunu yazmaya ├žal─▒┼čm─▒yorum ".

San─▒r─▒m baz─▒ g├Âr├╝┼čmecilerin ├žok zor bir soru olarak adland─▒r─▒lan─▒n a├ž─▒k├ža ifade edilmesinin zorunlulu─čunu kabul edece─čini d├╝┼č├╝n├╝yorum, ama ├Âzellikle mant─▒kl─▒ bir d├╝┼č├╝nceyle destekleyebilecekleri ve sorumu ├ž├Âzebilecekleri zaman, bir fikri olan geli┼čtiricilere ald─▒r─▒┼č etmiyorum. kendileri hakk─▒nda anlaml─▒ bir ifade.


68







B├Âyle bir g├Âr├╝┼čme sorusu al─▒rsan─▒z (veya kodunuzda e┼čit derecede beklenmedik bir davran─▒┼č oldu─čunu fark ederseniz), ilk bak─▒┼čta imkans─▒z g├Âr├╝nen bir davran─▒┼ča neden olabilecek ┼čeyler hakk─▒nda d├╝┼č├╝n├╝n:

  1. Kodlama : Bu durumda bakt─▒─č─▒n─▒z de─či┼čken, d├╝┼č├╝nd├╝─č├╝n├╝z gibi de─čildir. Bu, bir de─či┼čkenin ad─▒n─▒ bir ba┼čkas─▒na benzemek i├žin homojen harfleri veya bo┼čluk karakterlerini kullanarak kas─▒tl─▒ olarak Unicode ile u─čra┼č─▒rsan─▒z olu┼čabilir , ancak kodlama sorunlar─▒ da ├Ârne─čin, beklenmedik bir Unicode kodu i├žeren Web'den kod kopyalarken ve yap─▒┼čt─▒r─▒rken puanlar (├Ârne─čin, bir i├žerik y├Ânetim sistemi fl Unicode 'LATIN SMALL LIGATURE FL' (U + FB02) ile de─či┼čtirilmesi gibi baz─▒ "otomatik bi├žimlendirme" yapt─▒─č─▒ i├žin ).

  2. Yar─▒┼č ko┼čullar─▒ : Bir yar─▒┼č ko┼čulu olu┼čabilir, yani kod geli┼čtirici taraf─▒ndan beklenen dizide y├╝r├╝tme olmayan bir durum. Yar─▒┼č ko┼čullar─▒ genellikle ├žok i┼č par├žac─▒kl─▒ kodda meydana gelir, ancak birden fazla i┼č par├žac─▒─č─▒ yar─▒┼č ko┼čullar─▒n─▒n m├╝mk├╝n olmas─▒ i├žin bir gereklilik de─čildir - e┼čzamans─▒zl─▒k yeterlidir (ve kafan─▒z kar─▒┼čmaz, e┼čzamans─▒z, ba┼čl─▒k alt─▒nda birden fazla i┼č par├žac─▒─č─▒ kullan─▒ld─▒─č─▒ anlam─▒na gelmez ).

    Bu nedenle, JavaScript'in yaln─▒zca tek i┼č par├žac─▒kl─▒ oldu─ču i├žin yar─▒┼č ko┼čullar─▒ndan ar─▒nd─▒r─▒lm─▒┼č olmad─▒─č─▒n─▒ unutmay─▒n. Basit bir i┼č par├žac─▒─č─▒ - ancak zaman uyumsuz - ├Ârnek i├žin buraya bak─▒n . Tek bir ifade ba─člam─▒nda, yar─▒┼č ko┼čulu ancak JavaScript'te olduk├ža zor olacakt─▒r.

    Birden fazla i┼č par├žac─▒─č─▒ olabilece─činden web ├žal─▒┼čanlar─▒ ile JavaScript biraz farkl─▒d─▒r. @mehulmpt bize web ├žal─▒┼čanlar─▒n─▒ kullanan harika bir konsept kan─▒t─▒ g├Âsterdi .

  3. Yan etkiler : E┼čitlik kar┼č─▒la┼čt─▒rmas─▒ i┼čleminin bir yan etkisi (buradaki ├Ârneklerde oldu─ču kadar a├ž─▒k olmas─▒ gerekmeyen, genellikle yan etkiler ├žok belirsizdir).

Klasik birini g├Ârm├╝yorsan─▒z bu y├╝zden sorunlar Bu t├╝r bir├žok programlama dilleri, sadece JavaScript g├Âr├╝nebilecek JavaScript WTF'lerinizi burada 1 .

Tabii ki, g├Âr├╝┼čme sorusu ve buradaki ├Ârneklerin hepsi ├žok ├žeki┼čmeli g├Âr├╝n├╝yor. Ancak bunlar iyi bir hat─▒rlatmad─▒r:

  • Yan etkiler ├žok k├Ât├╝ olabilir ve iyi tasarlanm─▒┼č bir program─▒n istenmeyen yan etkilerden ar─▒nd─▒r─▒lm─▒┼č olmas─▒ gerekir.
  • ├çok i┼č par├žac─▒kl─▒ ve de─či┼čken durum sorunlu olabilir.
  • Karakter kodlamas─▒ ve karakter i┼čleme hakk─▒ yapmamak k├Ât├╝ hatalara yol a├žabilir.

1 ├ľrne─čin, burada bir yan etki sergileyen tamamen belirgin bir programlama dilinde (C #) bir ├Ârnek bulabilirsiniz .


42







─░┼čte ba┼čka bir varyasyon, istedi─činiz de─čerleri almak i├žin bir dizi kullanarak.

 const a = {
  n: [3,2,1],
  toString: function () {
    return a.n.pop();
  }
}

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


41







Tamam, jenerat├Ârler ile ba┼čka bir kesmek:

 const value = function* () {
  let i = 0;
  while(true) yield ++i;
}();

Object.defineProperty(this, 'a', {
  get() {
    return value.next().value;
  }
});

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


31







Proxy'leri kullanma :

 var a = new Proxy({ i: 0 }, {
    get: (target, name) => name === Symbol.toPrimitive ? () => ++target.i : target[name],
});
console.log(a == 1 && a == 2 && a == 3);
 

Proxy'ler temel olarak bir hedef nesne (ilk parametre) gibi davran─▒r, ancak hedef nesne ├╝zerindeki i┼člemleri durdurur (bu durumda "├Âzellik al" i┼člemi), b├Âylece varsay─▒lan nesne davran─▒┼č─▒ndan ba┼čka bir ┼čey yapma f─▒rsat─▒ vard─▒r. Bu durumda "├Âzelli─či olsun" eylem ├ža─čr─▒ld─▒─č─▒nda a zaman == her say─▒s─▒yla kar┼č─▒la┼čt─▒rabilirsiniz amac─▒yla t├╝r├╝n├╝ coerces. Bu olur:

  1. ├ľzelli─čin bizim sayac─▒m─▒z { i: 0 } oldu─ču bir hedef nesne yarat─▒yoruz i
  2. Hedef nesne i├žin bir Proxy olu┼čturup atad─▒k. a
  3. Her a == kar┼č─▒la┼čt─▒rma i├žin, a 's t├╝r├╝ ilkel bir de─čere zorlan─▒r
  4. Bu tip zorlama a[Symbol.toPrimitive]() dahili olarak arama yap─▒lmas─▒na neden olur.
  5. Proxy a[Symbol.toPrimitive] , "get i┼čleyiciyi" kullanarak i┼člevi almay─▒ engelliyor
  6. M├╝lkiyet kazan─▒lm─▒┼č olan o vekilin "i┼čleyicisi olsun" kontrol eder Symbol.toPrimitive , bu durumda o art─▒r─▒r ve daha sonra hedef nesneden sayac─▒ d├Ând├╝r├╝r: ++target.i . Farkl─▒ bir ├Âzellik al─▒n─▒yorsa, varsay─▒lan ├Âzellik de─čerini d├Ând├╝rmeye geri d├Âneriz, target[name]

Yani:

 var a = ...; // a.valueOf == target.i == 0
a == 1 && // a == ++target.i == 1
a == 2 && // a == ++target.i == 2
a == 3    // a == ++target.i == 3
 

Di─čer cevaplar─▒n ├žo─čunda oldu─ču gibi, bu yaln─▒zca gev┼ček bir e┼čitlik kontrol├╝ ( == ) ile ├žal─▒┼č─▒r , ├ž├╝nk├╝ kat─▒ e┼čitlik kontrolleri ( === ), Proxy'nin engelleyebilece─či t├╝r zorlama yapmaz.


28







Asl─▒nda, sorunun ilk k─▒sm─▒na cevap her programlama dilinde "Evet" dir. ├ľrne─čin, bu C / C ++ durumunda:

 #define a   (b++)
int b = 1;
if (a ==1 && a== 2 && a==3) {
    std::cout << "Yes, it's possible!" << std::endl;
} else {
    std::cout << "it's impossible!" << std::endl;
}
 

27







Ayn─▒, ancak farkl─▒, ancak yine de ayn─▒ (birden ├žok kez "test edilebilir"):

 const a = { valueOf: () => this.n = (this.n || 0) % 3 + 1}
    
if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}

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

Benim fikrim, Number nesne tipi denkleminin nas─▒l ├žal─▒┼čt─▒─č─▒yla ba┼člad─▒.


26







Bunu uygulamak i├žin en az kod oldu─čunu d├╝┼č├╝n├╝yorum:

 i=0,a={valueOf:()=>++i}

if (a == 1 && a == 2 && a == 3) {
  console.log('Mind === Blown');
} 

Her ├ža─čr─▒da valueOf global bir de─či┼čkeni art─▒ran bir custom ile sahte bir nesne olu┼čturma i . 23 karakter!


23







Sembollerden faydalanan bir ECMAScript 6 cevab─▒:

 const a = {value: 1};
a[Symbol.toPrimitive] = function() { return this.value++ };
console.log((a == 1 && a == 2 && a == 3));
 

Nedeniyle == kullan─▒m─▒, JavaScript zorlamak gerekiyordu a ikinci i┼členen bir ┼čey yak─▒n i├žine ( 1 , 2 , 3 bu durumda). Ancak JavaScript kendi ba┼č─▒na zorlamay─▒ bulmaya ├žal─▒┼čmadan ├Ânce, aramaya ├žal─▒┼č─▒r Symbol.toPrimitive . Symbol.toPrimitive JavaScript sa─člarsan─▒z i┼člevinizin d├Ând├╝rd├╝─č├╝ de─čeri kullan─▒rs─▒n─▒z. Olmazsa, JavaScript ├ža─č─▒r─▒r valueOf .


23







Bu, global de─či┼čkene neden olan g├╝zel bir yan etkiye sahip defineProperty'yi kullan─▒r!

 var _a = 1

Object.defineProperty(this, "a", {
  "get": () => {
    return _a++;
  },
  configurable: true
});

console.log(a)
console.log(a)
console.log(a) 


12







valueOf Bir s─▒n─▒f bildirgesinde ge├žersiz k─▒l─▒narak , yap─▒labilir:

 class Thing {
    constructor() {
        this.value = 1;
    }

    valueOf() {
        return this.value++;
    }
}

const a = new Thing();

if(a == 1 && a == 2 && a == 3) {
    console.log(a);
}
 

Olan valueOf , her kar┼č─▒la┼čt─▒rma operat├Âr├╝nde buna denir. Birincisinde, a e┼čit olacak 1 , ikincisinde a e┼čit olacak 2 ve b├Âyle devam edecek , ├ž├╝nk├╝ her seferinde valueOf ├ža─čr─▒lan de─čer a artar.

Bu nedenle, konsol.log ate┼členecek ve ├ž─▒k─▒┼č yapacak (zaten benim terminalimde) Thing: { value: 4} , ko┼čulun do─čru oldu─čunu belirterek.


0



─░lgili yay─▒nlar


Java'da (a == 1 && a == 2 && a == 3) do─čru olarak de─čerlendirilebilir mi?

Neden ([1,0] == Do─čru'da 1) Yanl─▒┼č olarak de─čerlendiriliyor? [├žift]

Neden `e─čer Yok .__ eq __ (ÔÇť a ÔÇŁ)ÔÇŁ Do─čru olarak de─čerlendiriliyor gibi g├Âr├╝n├╝yor (ama tam de─čil)?

Neden! {} [True] JavaScript'te true olarak de─čerlendiriliyor?

Neden (i <= j && j <= i && i! = J) DO─×RU olarak de─čerlendiriliyor?

Neden `a == b veya c veya d` her zaman Do─čru olarak de─čerlendirilir?

Neden 1234 == '1234 testi' do─čru olarak de─čerlendiriliyor? [├žift]

JavaScript: empty array, [] ko┼čullu yap─▒larda true olarak de─čerlendirir. Bu neden?

EditText.setFocusable (yanl─▒┼č); do─čru olarak ayarlanamaz. : /

Sizeof` * ger├žekten * `std :: size_t` olarak de─čerlendirir mi? Olabilir mi?

Etiketle ilgili di─čer sorular [javascript]


Bir t├╝r├╝n C# reflection ile bir aray├╝z olu┼čturup olu┼čturmad─▒─č─▒ nas─▒l belirlenir

Typescript: Aray├╝zler ve Tipler

D├╝zenli ifadeler ba─člam─▒nda 'tembel' ve 'a├žg├Âzl├╝' ne demektir?

PowerShell beti─čine bir arg├╝man nas─▒l iletilir?

Android'de 'Uygulama Y├╝klenmedi' Hatas─▒

Neden java.util.logging kullanm─▒yorsunuz?

GitHub: ge├žersiz kullan─▒c─▒ ad─▒ veya ┼čifre

Android Studio: Derleyici Hatas─▒ ├ç─▒k─▒┼č Penceresi Nerede?

T├╝m tablolar─▒, sakl─▒ yordamlar─▒, tetikleyicileri, k─▒s─▒tlamalar─▒ ve t├╝m ba─č─▒ml─▒l─▒klar─▒ bir sql deyimine b─▒rak─▒n

Android kameradan sunucuya video ak─▒┼č─▒