Saya sudah lama terganggu tentang hal ini, jadi saya akhirnya meneliti ini dan memberi Anda alasan panjang lebar mengapa hal-hal seperti itu adanya.
Dari 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)
Jadi sekarang kita pergi ke 11.9.6
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.
Itu dia. Operator triple sama dengan yang diterapkan pada string mengembalikan true jika argumen benar-benar string yang sama (panjang yang sama dan karakter yang sama di posisi yang sesuai).
Jadi ===
akan berfungsi dalam kasus ketika kami mencoba membandingkan string yang mungkin berasal dari sumber yang berbeda, tetapi yang kami tahu pada akhirnya akan memiliki nilai yang sama - skenario yang cukup umum untuk string sebaris dalam kode kami. Sebagai contoh, jika kita memiliki variabel bernama connection_state
, dan kita ingin tahu di mana salah satu dari keadaan berikut ['connecting', 'connected', 'disconnecting', 'disconnected']
ini sekarang, kita dapat langsung menggunakan ===
.
Tapi masih ada lagi. Tepat di atas 11.9.4, ada catatan singkat:
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. Apa sekarang? String yang diperoleh secara eksternal dapat, dan kemungkinan besar akan, aneh unik, dan lembut kita ===
tidak akan melakukannya dengan adil. In datang localeCompare
untuk menyelamatkan:
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.
Kita bisa pulang sekarang.
tl; dr;
Untuk membandingkan string dalam javascript, gunakan localeCompare
; jika Anda tahu bahwa string tidak memiliki komponen non-ASCII karena mereka, misalnya, konstanta program internal, maka ===
juga berfungsi.
JavaScript case insensitive string comparison
di stackoverflow.com/questions/2140627/…