JSによる等価性の比較方法

「=== 厳密等価演算子」

a===b の比較規則は次のとおりです。

  1. a が b と等しくない場合は false を返します
  2. a=null と b==null が等しい場合、true を返します。
  3. a=未定義と b=未定義が等しい場合、true を返します。
  4. a と b が両方ともブール値 true、または両方ともブール値 false である場合、等しい場合、true を返します。
  5. a と b が両方とも数値で等しい場合、等しい場合は true を返します。(=== は0 を -0 と等しいとみなします)
  6. a と b の両方が Infinity の場合、それらは等しく、 true を返します ( Infinityは -Infinity と等しくなく、NaN は NaN を含む任意の数値と厳密には等しくありません)。
  7. a と b が両方とも文字列で、同じ位置にある 16 が同じ Unicode コード値である場合、a と b は等しく、true を返します。( a と b の長さが異なる場合、または見た目は同じでも Unicode 値が異なる場合は等しくありません)
  8. a と b が同じオブジェクト (配列、関数) を参照する場合、それらは等しく、false を返します。(まったく同じプロパティとプロパティ値を持っていても、異なるオブジェクトを参照している場合は等しくありません)

「==」等価演算子

"== 2 つのデータを比較する場合、2 つのデータ型が等しい場合は完全等価 "===" に従って比較されます。比較する 2 つのデータ型が異なる場合は、以下に従って型変換を試してください。同等性を決定する前のルール:

  1. 一方の値が null で、もう一方の値が未定義の場合は等しい。
  2. 一方の値が数値で、もう一方の値が文字列の場合、文字列を数値に変換し、変換された数値を比較します。
  3. いずれかがブール値の場合は、ブール値を値に変換(true は 1、false は 0 に変換)して比較します。
  4. 一方の値が bigint (大きな整数) の場合、もう一方の値を数値に変換して比較します。
  5. 値がシンボルの場合、他の値もその値とまったく同じシンボルを参照している場合にのみ等しいと言えます。
  6. 一方の値がオブジェクトで、もう一方の値がブール値の場合、オブジェクトを true に設定して比較します。
  7. 一方の値がオブジェクト (関数を含む) で、もう一方の値が数値または文字列の場合、オブジェクトはその valueOf メソッドを暗黙的に呼び出そうとし、valueOf メソッドが非オブジェクト データ型を返す場合は、この戻り値を使用して比較します。 valueOf がオブジェクト型を返した場合は、その toString メソッドの戻り値を別の値と比較してみます。( Date 型の場合、最初に toString が試行され、次に valueOf が試行されます)

変換ルールは次のとおりです。

価値 文字列に変換する 数値に変換する ブール値に変換する
未定義 "未定義" NaN 間違い
ヌル "ヌル" 0 間違い
真実 "真実" 1
間違い "間違い" 0
"" (空の文字列) 0 間違い
「1.2」(空ではない数値文字列) 1.2 真実
"abc" (空でない非数値文字列) NaN 真実
0 「0」 間違い
-0 「0」 間違い
1 (制限された非ゼロ値) 「1」 真実
無限大 「インフィニティ」 真実
-無限大 「-無限大」 真実
NaN 「な~ん」 間違い
{} (任意のオブジェクト) 上記のルール 7 上記の 7 番目のルール 真実
[] (空の配列) 「」 0 真実
[2] (数値要素) 「2」 2 真実
[「あ」] 結合メソッドの呼び出し NaN 真実
任意の機能 上記のルール 7 NaN 真実

次のコードとコメントを注意深く読めば、間違いなく多くのことを得ることができるでしょう。もちろん、データ比較のすべての順列と組み合わせがここでカバーされているわけではありません。

console.log(1 == "1"); // true 将字符串"1"转成数值1
console.log(2 == true); // false 将true转成1
console.log("abc" == true); // false 将true转成字符串"true"
console.log(null == undefined); // true 规则1
console.log(NaN == "abc"); // 将"abc"转成数值为NaN,但==认为NaN与NaN不相等
console.log(Infinity == "Infinity"); // 将字符串"Infinity"转成数值Infinity
console.log(0 == -0); // ==认为+0与-0相等
console.log([] == ""); // true 空数组转成空字符串
console.log([] == true); // false []转成0.true转成1
console.log([] == []); // false 两个数组不是同一个对象
console.log([] == ![]); // false 后一个空数组转成布尔值取反为false,转换后类型不一样。false再转成0,再将前一个数组转成数值0
console.log([1] == 1); // true 数组转[1]调用join方法转成字符串"1",再将字符串"1"转成数值1
console.log([1, 2] == "1,2"); // true 数组调用join方法转成字符串"1,2"
console.log(Symbol.iterator == false); // false 规则5
console.log(Symbol.iterator == true); // false 规则5
console.log(2n == "2"); // true 把字符串"2"转成数值2,再与bigint值2n 进行值的比较
let o1 = {
  valueOf() {
    return 3;
  },
};

let o2 = {
  valueOf() {
    return {};
  },
  toString() {
    return "3";
  },
};

console.log(o1 == o2); // false 不是同一个对象
console.log(o1 == 3); // true 按照规则7将o1转换为数值3
console.log(o2 == 3); // true 按照规则7将o2转换为"3"(先调用valueOf返回不是非对象数据类型,会再调用toString),再将"3"转换为数值3

Object.is(a,b) は、a と b が同じ値 (SameValue) であるかどうかを判断します。

Object.is メソッドは 2 つの値が同じ値であるかどうかを判定し、以下の条件のいずれかを満たす場合、2 つの値は等しいと判断します。

  • 未定義です
  • すべてヌルです
  • 両方 true または両方 false
  • すべて同じ長さ、同じ文字、同じ順序の文字列です。
  • 両方とも同じオブジェクトです (両方とも同じオブジェクトへの値参照であることを意味します)
  • は数字であり、
    • 全てです +0
    • 全てです -0
    • すべてNaNです
    • 両方とも同じ値であり、ゼロ以外であり、どちらも NaN ではありません

Object.is() == とは異なります。== 演算子は、両側の値を強制することなく、等価性を評価する前に両側の変数をキャストします (同じ型でない場合) (この動作は と評価され "" == false ます trueObject.is 。

Object.is() また、 === とは異なります。違いは、符号付きゼロと NaN の扱いが異なることです。たとえば、=== 演算子 (および == 演算子) は数値 -0 と を +0 等しいものとして扱いますが、Number.NaN と NaN は等しくないものとして扱います。

SameValueZero (API はまだ利用できません)

0、+0、-0 はすべて等しいと考えてください。その他はSameValueと同じです。

配列のincludesメソッド、 Mapのhasメソッド内の比較などがそのようなルールです。

おすすめ

転載: blog.csdn.net/m0_52726759/article/details/129393535