Soru Neden `null> = 0 && null <= 0`, ancak null == 0` değil?


Türünün bir değişkenin değerini 1 ile artıran bir rutin yazmak zorunda kaldım. number ve değişkenin başlangıçta 0 olduğu değişkene 0 atar null veya undefined.

İlk uygulama v >= 0 ? v += 1 : v = 0 çünkü bir sayının hiçbir şeyin aritmetik bir ifadeyi yanlış yapacağını düşündüm, ama bu yanlıştı. null >= 0 doğru olarak değerlendirilir. Sonra öğrendim null 0 gibi davranır ve aşağıdaki ifadeler doğru olarak değerlendirilir.

  • null >= 0 && null <= 0
  • !(null < 0 || null > 0)
  • null + 1 === 1
  • 1 / null === Infinity
  • Math.pow(42, null) === 1

Tabii ki, null 0 değil. null == 0 false olarak değerlendirilir. Bu, görünüşte tatolojik ifadeyi yapar (v >= 0 && v <= 0) === (v == 0) yanlış.

Neden ki null 0 gibi olsa da, aslında 0 değil?


114
2018-05-26 06:19


Menşei


Javascript hakkında konuşuyor. Örneğin PHP'de. PHP operatöründe ==, değerleri özel bir şekilde karşılaştırır. "10" == "1e1" (gerçek olan) gibi gerçekten çılgın karşılaştırmalar yapabilirsiniz. Operatör ==='u kullandıysanız, farklı bir sonuç elde edersiniz, çünkü türün değerin yanı sıra eşleşip eşleşmediğini kontrol eder. Bu bağlantıyı kontrol et: php.net/manual/en/language.operators.comparison.php - Pijusn
PHP '==' operatörü gerçekten "özel" bir şekilde çalışıyor. - Two-Bit Alchemist
Gereksiniminiz 0 yerine 1'de saymaya başlayacak olsaydı, başlangıçta ya sayacak sayaçları arttırmak için gerçekten ters bir yol var. null veya undefined: c = -~c // Results in 1 for null/undefined; increments if already a number - Ates Goral
undefined başlatılmamış değişkenler için değişken bir değerdir. nullÖte yandan, boş bir nesne değeridir ve sayılarla karıştırılmamalıdır. null Sayılarla birleştirilmemelidir, bu yüzden null sayı gibi davranmamalıdır. - Matthew


Cevaplar:


Asıl sorunun şu gibi görünüyor:

Niye ya:

null >= 0; // true

Fakat:

null == 0; // false

Gerçekten olan şey şu ki Daha büyük veya eşit operatör  (>=), tip baskısı yapar (ToPrimitive), Birlikte ipucu bir çeşit NumberAslında tüm ilişkisel operatörler bu davranışa sahiptir.

null tarafından özel bir şekilde tedavi edilir Eşit Operatör (==). Kısaca, sadece coerces için undefined:

null == null; // true
null == undefined; // true

Gibi değer false, '', '0', ve [] Sayısal tip zorlamaya tabidir, hepsi sıfıra zorlanır.

Bu sürecin iç detaylarını görebilirsiniz. Soyut Eşitlik Karşılaştırma Algoritması ve Soyut İlişkisel Karşılaştırma Algoritması.

Özetle:

  • İlişkisel Karşılaştırma: eğer her iki değer de String değilse, ToNumber ikisine de denir. Bu ek olarak aynı + Önünde, hangi için null cebirleri 0.

  • Eşitlik Karşılaştırması: sadece çağrılar ToNumber Dizeler, Sayılar ve Booleanlar.


176
2018-05-26 06:39



Merhaba CMS, açıklamanıza göre, ilkel 0'dır, bu nedenle 0> = 0, true değerini döndürür ve ==, ecma algoritmasına göre false.but döndürür. Type (x), Object ve Type (y) ise String veya Number ise Karşılaştırma sonucunu geri döndürünTarih (x) == y.then bu doğru dönmelidir.Lütfen bana açıklayın - bharath muppa
bana cevap bir Cevap - null is treated in a special way by the Equals Operator (==). In a brief, it only coerces to undefined: - Ve ne? Bana nedenini açıklayabilir misin null >= 0? :) - Andrey Deineko
@bharathmuppa @ andrey-deineko: CMS'nin cevabının geri kalanı şurası: Soyut İlişkisel Karşılaştırma Algoritması  3. noktada açıklar. Her iki değer de String ise, ToNumber her ikisinde de çağrılır. Bu ek olarak aynı + Önünde, hangi için null cebirleri 0. Eşitlik, yalnızca Dizeleri, Sayıları ve Boole'lardaki Numaraları çağırır. - Michael Liquori
İyi bir açıklama, ama hoşuma gitmedi. Herhangi bir dilde (x == 0 || x> 0), (x> = 0) ile eşdeğer olmalıdır. Javascript aptal bir dildir. - John Henckel
Bu gerçekten bir hata (aslında matematiksel olarak yanlıştır) ve milyonlarca web sitesi null karşılaştırmalar ^^ 'dayanır beri bu konuda yapılacak bir şey yok - mahieddine


Sorunun görünürlüğünü daha da iyileştirmek için soruyu genişletmek istiyorum:

null >= 0; //true
null <= 0; //true
null == 0; //false
null > 0;  //false
null < 0;  //false

O sadece hiçbir anlam ifade etmiyor. İnsan dilleri gibi, bu şeylerin de kalpten öğrenilmesi gerekir.


10
2018-03-14 17:46



Yukarıda açıklandığı gibi, nasıl == null davranır gibi bir istisna ile açıklanabilir, aksi halde null her durumda Number (nulll) kullanılarak 0'a dönüştürülür. - Sourabh Ranka


JavaScript'in hem sıkı hem de tür dönüşümü karşılaştırmaları vardır

null >= 0; doğru fakat (null==0)||(null>0) yanlış

null <= 0; doğru ama (null==0)||(null<0) yanlış

"" >= 0 ayrıca doğru

İlişkisel soyut karşılaştırmalar için (<=,> =), işlenenler önce karşılaştırmadan önce ilkellere, daha sonra aynı türe dönüştürülür.

typeof null returns "object"

Yazım nesnesi olduğunda javascript nesneyi dizgilemeye çalışır (yani boş) aşağıdaki adımlar atılır (ECMAScript 2015):

  1. Eğer PreferredType geçmedi, bırak hint "varsayılan" olmak.
  2. Eğer varsa PreferredType olduğu hint Dize, bırak hint "string" olmak.
  3. Başka PreferredType olduğu hint Numara, izin hint "sayı" olmak.
  4. let exoticToPrim olmak GetMethod(input, @@toPrimitive).
  5. ReturnIfAbrupt(exoticToPrim).
  6. Eğer exoticToPrim undefined değil, o zaman
    a) Sonuç alınsın Call(exoticToPrim, input, «hint»).
    b) ReturnIfAbrupt(result).
    c) Eğer Type(result) Nesne değil, sonuç döndür.
    d) TypeError istisnası atın.
  7. Eğer hint "varsayılan" dır hint "sayı" olmak.
  8. Dönüş OrdinaryToPrimitive(input,hint).

İpucu için izin verilen değerler "varsayılan", "sayı" ve "dize" dir. Tarih nesneleri, "default" u "string" ile eşdeğer olarak kabul ettikleri için yerleşik ECMAScript nesnesi arasında benzersizdir. Diğer tüm yerleşik ECMAScript nesneleri "varsayılan" olarak "sayı" ile eşdeğer olarak davranır.. (ECMAScript 20.3.4.45)

Bence düşünüyorum null 0'a dönüştürür.


4
2017-08-09 05:49





Bende aynı sorun vardı. Şu anda tek çözümüm ayırmak.

var a = null;
var b = undefined;

if (a===0||a>0){ } //return false  !work!
if (b===0||b>0){ } //return false  !work!

//but 
if (a>=0){ } //return true !

0
2018-05-14 17:23