Bu konuda uzun süredir rahatsız olmuştum, bu yüzden sonunda bunu araştırdım ve şeylerin neden böyle olduğu için bu uzun soluklu nedeni verdim.
Gönderen spec :
Section 11.9.4 The Strict Equals Operator ( === )
The production EqualityExpression : EqualityExpression === RelationalExpression
is evaluated as follows:
- Let lref be the result of evaluating EqualityExpression.
- Let lval be GetValue(lref).
- Let rref be the result of evaluating RelationalExpression.
- Let rval be GetValue(rref).
- Return the result of performing the strict equality comparison
rval === lval. (See 11.9.6)
Şimdi 11.9.6'ya gidiyoruz
11.9.6 The Strict Equality Comparison Algorithm
The comparison x === y, where x and y are values, produces true or false.
Such a comparison is performed as follows:
- If Type(x) is different from Type(y), return false.
- If Type(x) is Undefined, return true.
- If Type(x) is Null, return true.
- If Type(x) is Number, then
...
- If Type(x) is String, then return true if x and y are exactly the
same sequence of characters (same length and same characters in
corresponding positions); otherwise, return false.
Bu kadar. Dizelere uygulanan üçlü eşittir işleci, bağımsız değişkenler tam olarak aynı dizelerse (karşılık gelen konumlarda aynı uzunluk ve aynı karakterler) true değerini döndürür.
Yani ===
farklı kaynaklardan gelmiş olabilir dizeleri karşılaştırmak için çalışıyoruz durumda iş, ama sonunda aynı değerlere sahip olacaktır biliyorum hangi olacak - Bizim kodunda satır içi dizeleri için ortak yeterince senaryo. Örneğin, adında bir değişkenimiz varsa connection_state
ve şu ['connecting', 'connected', 'disconnecting', 'disconnected']
andaki durumlardan hangisinin şu anda olduğunu bilmek istiyorsak doğrudan ===
.
Ama dahası da var. 11.9.4'ün hemen üzerinde kısa bir not var:
NOTE 4
Comparison of Strings uses a simple equality test on sequences of code
unit values. There is no attempt to use the more complex, semantically oriented
definitions of character or string equality and collating order defined in the
Unicode specification. Therefore Strings values that are canonically equal
according to the Unicode standard could test as unequal. In effect this
algorithm assumes that both Strings are already in normalized form.
Hmm. Şimdi ne var? Dışarıdan elde edilen dizeler tuhaf unicodey olabilir ve büyük olasılıkla olacaktır ve nazikimiz ===
onları adalet yapmayacaktır. localeCompare
Kurtarmaya gelir :
15.5.4.9 String.prototype.localeCompare (that)
...
The actual return values are implementation-defined to permit implementers
to encode additional information in the value, but the function is required
to define a total ordering on all Strings and to return 0 when comparing
Strings that are considered canonically equivalent by the Unicode standard.
Şimdi eve gidebiliriz.
tl; dr;
Javascript dizeleri karşılaştırmak için localeCompare
; örneğin dahili program sabitleri oldukları için dizelerin ASCII olmayan bileşenleri olmadığını biliyorsanız, o zaman ===
da çalışır.
JavaScript case insensitive string comparison
. stackoverflow.com/questions/2140627/…