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.
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?
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
Ha 0 == "0"
a fejlesztői konzolon fut , miért tér vissza true
?
0
szá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!
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.
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....
Furcsa, igaz? Hát szokja meg, még félúton sem vagyunk.
2. panel - A tömböket is kényszerítik
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
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 toString
módszerét keresi annak kényszerítésére.
Tömbök esetén toString
az ö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() // ""
A specifikáció ToPrimitive
ezt 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
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 == 0
még egyszer ...
3. panel - Gyors áttekintés
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:
ToPrimitive([])
üres karakterláncot ad- 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!
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
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!