A legjobb JavaScript mém, amit valaha láttam, részletesen elmagyarázva

TLDR: Kényszerítse magát a hármas egyenlőség használatára.

Szándéktalanul találtam meg ezt a JavaScript-mémet a Reddit-en, és ez a legjobb, amit valaha láttam.

best-js-meme-to-date-2

A mém pontosságát az összes kódrészlet futtatásával ellenőrizheti a Fejlesztői eszközökben. Az eredmény nem meglepő, de mégis kissé kiábrándító.

Természetesen ez a kis kísérlet elgondolkodtatott ...

Miért történik ez?

miért-történik ez

Tapasztalatok alapján megtanultam átfogni a JavaScript sima oldalait, miközben óvatosak a tüskés fenyők. Ennek ellenére ennek a sarok esetnek a részletei még mindig becsesek voltak.

Pontosan úgy, ahogy Kyle Simpson mondja ...

"Nem hiszem, hogy bárki is ismerné valaha JS-t, egyébként sem teljesen."

Amikor ezek az esetek felbukkannak, a legjobb, ha megtekinti a forrást - a hivatalos ECMAScript specifikációt, amelyből a JavaScript épül.

A specifikációval a kezünkben mélyen megértsük, mi folyik itt.

1. panel - A kényszer bevezetése

panel-1-1

Ha 0 == "0"a fejlesztői konzolon fut , miért tér vissza true?

0szám, és "0"karakterlánc, soha nem szabad, hogy azonosak legyenek! A legtöbb programozási nyelv ezt tiszteletben tartja. 0 == "0"például a Java-ban ezt adja vissza:

error: incomparable types: int and String 

Ez teljesen logikus. Ha össze akarod hasonlítani a Java-ban az int és a String karaktereket, először át kell alakítanod őket ugyanarra a típusra.

De ez a JavaScript, mind!

this-is-javascript

Ha két értéket hasonlít össze ==, akkor az egyik érték kényszeren eshet át .

Kényszer - Egy érték automatikus módosítása egyik típusról a másikra.

Itt automatikusan a kulcsszó. Ahelyett, hogy kifejezetten átalakítaná a típusait, a JavaScript megteszi helyettetek a kulisszák mögött.

scumbag-javascript

Ez akkor kényelmes, ha szándékosan kihasználja, de potenciálisan káros, ha nincs tisztában annak következményeivel.

Itt található a hivatalos ECMAScript nyelvi specifikáció. Átfogalmazom a vonatkozó részt:

Ha x szám, y pedig karakterlánc, adja vissza az x == számot (y)

Tehát a mi esetünkben 0 == "0":

Mivel 0 szám, és "0" karakterlánc, adja vissza a 0 == számot ("0")

A húrunkat "0"titokban átalakítottuk 0, és most egy gyufánk van!

0 == "0" // true // The second 0 became a number! // so 0 equals 0 is true.... 

az a húr-titokban-szám lett

Furcsa, igaz? Hát szokja meg, még félúton sem vagyunk.

2. panel - A tömböket is kényszerítik

panel-2

Ez a hülyeség nem korlátozódik olyan primitívekre, mint a húrok, számok vagy logikai értékek. Itt van a következő összehasonlításunk:

0 == [] // true // What happened...? 

Újra kényszer! Átfogalmazom a specifikáció vonatkozó részét:

Ha x karakterlánc vagy szám, y pedig objektum, akkor adja vissza az x == függvényt (y)

Három dolog itt:

1. Igen, a tömbök objektumok

tömbök-objektumok

Sajnálom, hogy megtörtem.

2. Az üres tömb üres karakterlánccá válik

Ismét a specifikáció szerint JS először egy objektum toStringmódszerét keresi annak kényszerítésére.

Tömbök esetén toStringaz összes elemét összekapcsolja és karakterláncként adja vissza.

[1, 2, 3].toString() // "1,2,3" ['hello', 'world'].toString() // "hello,world" 

Mivel tömbünk üres, nincs mit csatlakoznunk! Ezért...

[].toString() // "" 

empty-array-coerces-to-empty-string-1

A specifikáció ToPrimitiveezt az üres tömböt üres húrokká változtatja. A hivatkozások itt és itt találhatók az Ön kényelme (vagy zavara) érdekében.

3. Az üres karakterlánc ekkor 0 lesz

üres-karakterláncok-0-vá válnak

Nem tudja kitalálni ezeket a dolgokat. Most, hogy rákényszerítettük a tömböt "", visszatértünk az első algoritmushoz ...

Ha x szám, y pedig karakterlánc, adja vissza az x == számot (y)

Így 0 == ""

Mivel a 0 szám és a "" karakterlánc, adja vissza a 0 == számot ("")

ToNumber("") 0-t ad vissza.

Ezért 0 == 0még egyszer ...

kényszer-minden-idő-2

3. panel - Gyors áttekintés

panel-3-1

Ez igaz

0 == "0" // true 

Mert a kényszer ezt megfordítja 0 == ToNumber("0").

Ez igaz

0 == [] // true 

Mivel a kényszer kétszer fut:

  1. ToPrimitive([]) üres karakterláncot ad
  2. Ezután ToNumber("")0-t ad.

Tehát akkor mondd meg nekem ... a fenti szabályok szerint mi térjen vissza?

"0" == [] 

4. panel - HAMIS!

panel-4-1

HAMIS! Helyes.

Ennek a résznek akkor van értelme, ha megértette a szabályokat.

Íme az összehasonlításunk:

"0" == [] // false 

Még egyszer hivatkozva a specifikációra:

Ha x karakterlánc vagy szám, y pedig objektum, akkor adja vissza az x == függvényt (y)

Azt jelenti...

Mivel a "0" karakterlánc, a [] pedig objektum, adjuk vissza az x == értéket

ToPrimitive([])üres karakterláncot ad vissza. Az összehasonlítás mára lett

"0" == "" 

"0"és ""mindkét karakterlánc, így a JavaScript szerint nincs szükség további kényszerítésre . Ezért kapjuk meg false.

Következtetés

just-use-triple-egyenlő

Használjon hármas egyenlőt, és nyugodtan aludjon éjszaka.

0 === "0" // false 0 === [] // false "0" === [] // false 

Teljesen elkerüli a kényszert, ezért azt hiszem, hatékonyabb is!

De a teljesítménynövekedés szinte értelmetlen. Az igazi győzelem az a megnövekedett bizalom, amelyet a kódja iránt érez, amivel az extra billentyűleütés teljesen megéri.

Ingyenes coachingot szeretnél?

Ha 15-30 perces ingyenes hívást szeretne ütemezni, hogy megvitassa a Front-End fejlesztési kérdéseit kóddal, interjúkkal, karrierrel vagy bármi mással kapcsolatban, kövessen a Twitteren és a DM-en.

Ezt követően, ha élvezi az első találkozónkat, megbeszélhetünk egy folyamatos coaching kapcsolatot, amely segít elérni a Front-End fejlesztési céljait!

Köszönöm, hogy elolvasta

További ilyen tartalomért nézze meg a //yazeedb.com oldalt!

A következő alkalomig!