JavaScript'te "true" == true neden false gösteriyor?


90

MDC ==operatörü şu şekilde tanımlar :

İki işlenen aynı türde değilse, JavaScript işlenenleri dönüştürür ve ardından katı karşılaştırma uygular. İşlenenlerden biri sayı veya mantıksal ise, işlenenler mümkünse sayılara dönüştürülür; başka işlenenlerden biri bir dizge ise, diğer işlenen mümkünse dizgeye dönüştürülür.

Bunu akılda tutarak "true" == trueşu şekilde değerlendiririm :

  1. Aynı türden mi? Hayır
  2. Ya işlenen bir sayı mı yoksa mantıksal mı? Evet
  3. İkisini de bir sayıya dönüştürebilir miyiz? Hayır ( isNaN(Number("true")) // true)
  4. İşlenenlerden biri dizge mi? Evet
  5. Diğer işleneni bir dizgeye dönüştürebilir miyiz? Evet ( String(true) === "true" // true)

Sonunda dizeleri buldum "true"ve "true"değerlendirilmesi gereken true, ancak JavaScript yanlış gösteriyor.

Neyi özledim?



6
Etrafta bu kadar çok JavaScript if("true" == true) {console.log("yes")} else {console.log("no")}; if("true") {console.log("yes")} else {console.log("no")}
varken

1
Söylemeliyim, şaşırdım ve bunun olması çok aptalca. Her zaman her zaman kullanmak için başka bir neden daha ===
BT

Yanıtlar:


89

Çünkü "true"dönüştürülür NaN, süre truedönüştürülür 1. Yani farklılar.

Sizin de bildirdiğiniz gibi, her ikisi de sayıya dönüştürülür, çünkü en azından trueolabilir (Erik Reppen'in yorumuna bakın) ve sonra karşılaştırılabilir.


Adımın ne zaman Can we convert both to a number?yanlış olacağını bana söyleyebilir misin ? Çift NaNsayı ise, bu adım nasıl başarısız olabilir?
Isaac

5
Ya ya da hiçbiri. Her ikisi de NaN ile sonuçlanırsa, dizi değerlendirmesine geçerler. Yalnızca biri dönüştürülebilirse, yine de bir sayı karşılaştırması vardır.
Erik Reppen

2
Aslında Javascript'te oldukça garip davranan bazı garip nesneler var. Örneğin, IE <9'daki XML belgeleri, onları sayılara dönüştürmeye çalıştığınızda bir hata verir.
MaxArt

Yaparak dönüşümleri kendiniz görebilirsiniz Number(true)veNumber('true')
Erik Reppen

11

==Karşılaştırma operatörü olan ECMA 5'de tanımlandığı gibidir:

  1. Eğer tipi (x) sayısı ve bir Tip (y), String,
    karşılaştırma X == sonucunu geri ToNumber (y).
  2. Eğer türü (X) dize ve bir Tip (y) sayısı,
    karşılaştırma sonucunu geri ToNumber (x) '== Y.
  3. Eğer Tip (x) Boole olan, karşılaştırma sonucunu döndürmek ToNumber (x) == y.
  4. Eğer Tip (y) Boole ise, karşılaştırma x == sonucunu döndürmek ToNumber (y).

Dolayısıyla, "true" == true şu şekilde değerlendirilir:

  1. "true" == ToNumber (true)   (kural 7 yoluyla)
  2. "true" == 1
  3. ToNumber ("true") == 1   (kural 5 yoluyla)
  4. NaN == 1

===> yanlış


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.