ホームページ > 記事 > ウェブフロントエンド > jsの==、===、Object.js()の内容を詳しく解説(総合)
この記事では、js の ==、=== および Object.js() について詳しく説明します。必要な方は参考にしていただければ幸いです。
この記事では主に、JavaScript の 3 つの等価演算、==、===、Object.js() について説明します。比較と事例を通じてみんなの感動を深め、個別の事例を詳しく解説。
ECMAScript7仕様におけるToPrimitive抽象演算の知識の詳細説明(例)
x === y の場合、この演算子の比較手順は次のとおりです。
1. x の型が y の型と異なる場合は、false を返します。 x の型が数値の場合:
a. x が NaN の場合は false を返し、y が NaN の場合は false を返します。 x と y が同じ数値の場合は true を返し、x が 0 で y が -0 の場合は true を返します。 0 の場合は true を返します。
f は false を返します。SameValueNonNumber(x, y) の結果を返します。
SameValueNonNumber(x, y) 抽象演算は、2 つの非数値を比較し、同じ型の x と y が等しいかどうかを比較します。 比較手順は次のとおりです。 x が null または未定義の場合、true を返します。x が文字列型の場合、
x と y がまったく同じ文字エンコーディング シーケンスの場合は true を返し、それ以外の場合は false を返します。
##3 、x がブール型の場合、#4。x と y が両方とも true または false の場合は true を返し、それ以外の場合は false を返します。シンボル タイプ
x と y が同じシンボル値の場合は true を返し、それ以外の場合は false を返します。x と y が同じオブジェクト値の場合は true を返し、そうでない場合は false を返します。間違い。
注意すべき点は、NaN、0、-0 です:
NaN === NaN // false +0 === -0 // true -0 === +0 // true
これら 3 つの例は、x === y 比較ステップの 2.1、2.4、および 2.5 にそれぞれ対応します。これら 3 つの例の出力結果は仕様の定義に完全に一致しています。これは仕様の定義に理由はありません。仕様がこのように定義されている理由については、仕様の作成者に問い合わせる必要があるかもしれませんが、これはこの記事の範囲外です。
Object.is()
Object.is(x, y) の場合、比較には抽象操作 SameValue(x, y) が使用されます。この抽象操作の手順は次のとおりです。
1. x の型が y の型と異なる場合は、
##2 を返します。 #a. x と y が両方とも NaN の場合は true を返し、x が 0 で y が -0 の場合は false を返します。 0 の場合は false を返し、d が同じ数値の場合は true を返し、e の場合は false を返します。 SameValueNonNumber(x, y)。 === と Object.is() の違いは、NaN と符号付き 0 の処理にあることがわかります。 x == y、この演算子の比較手順は次のとおりです: 1. x と y が同じ型の場合、x === y の結果を返します。 . x が null で、y が未定義の場合は true を返します。x が未定義で y が数値の場合は true を返します。 y の型が文字列の場合、x == ToNumber(y) の結果を返します。x の型が文字列で、y の型が数値の場合は、ToNumber の結果を返します。 (x) == y; 6. x の型がブール型の場合、y の型の場合は ToNumber(x) == y; の結果を返します。がブール型の場合、x == ToNumber(y) の結果を返します。x の型が文字列、数値、またはシンボルのいずれかで、y の型がオブジェクトの場合は、 x == ToPrimitive(y) の結果 9. x がオブジェクトであり、y の型が文字列、数値、またはシンボルのいずれかの場合、ToPrimitive(x) == の結果。 y が返されます。
#10. false を返します。
メソッド ToNumber は上記で使用されており、ToNumber(x) の手順は次のとおりです。
NaN === NaN // false +0 === -0 // true -0 === +0 // true Object.is(NaN, NaN) // true Object.is(+0, -0) // false Object.is(-0, +0) // falseまず、左側の [] は空の配列、型はオブジェクト、右側は ![] です。 , [] は true 値であるため、![] の結果は false になります:
[] == ![]その後、x == y 比較ステップに進みます。ステップ 7 で、x == ToNumber( の結果を返します。 y)、つまり:
[] == ![] // => [] == falseToNumber(x) のステップ 3 から、ToNumber(false) が 0 を返すことがわかります:
[] == false // => [] == ToNumber(false)次に、x == y のステップ 9 に進みます。比較ステップを実行し、ToPrimitive(x) == y の比較結果を返します:
[] == ToNumber(false) // => [] == +0ToPrimitive([]) の結果は空の文字列 "" です。理由を説明してください。記事の ToPrimitive 抽象操作を確認してください。 ECMAScript7仕様。したがって、上記は次と同等です:
[] == +0 // => ToPrimitive([]) == +0次に、x == y 比較ステップのステップ 5 に進み、ToNumber(x) == y の結果を返します。
"" == +0 // => ToNumber("") == +0
由ToNumber操作的第5步可知,ToNumber("")的结果是+0,所以也就是:
+0 == +0 // true
首先,左边是{},类型是对象,右边是!{},{}是真值,所以!{}是false:
{} == !{} // => {} == false
然后同样会走到x == y比较步骤的第7步,返回x == ToNumber(y)的结果,也就是:
{} == false // => {} == ToNumber(false)
由ToNumber(x)的第3步可知,ToNumber(false)返回+0:
{} == ToNumber(false) // => {} == +0
然后走到x == y比较步骤的第9步,返回ToPrimitive(x) == y的比较结果:
{} == +0 // => ToPrimitive({}) == +0
ToPrimitive({})的结果是字符串"[object Object]",原因请查看文章ECMAScript7规范中的ToPrimitive抽象操作。所以,上面等价于:
"[object Object]" == +0
然后走到x == y比较步骤的第5步,返回ToNumber(x) == y的结果:
"[object Object]" == +0 // => ToNumber("[object Object]") == +0
由ToNumber操作的第5步可知,ToNumber("[object Object]")的结果是NaN,所以也就是:
NaN == +0 // false
所以,[] == ![]的结果是true,{} == !{}的结果是false。可能有人第一次看到[] == ![]的时候,觉得这个的比较结果怎么可能是true。我觉得有时候不要感性的去认识问题,按照规定的运算步骤走一遍,结果是什么就是什么。
总结
本文讲解了JavaScript中的三种相等运算:==,===和Object.js(),希望对大家有所帮助。
以上がjsの==、===、Object.js()の内容を詳しく解説(総合)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。