ホームページ  >  記事  >  ウェブフロントエンド  >  jsの==、===、Object.js()の内容を詳しく解説(総合)

jsの==、===、Object.js()の内容を詳しく解説(総合)

不言
不言オリジナル
2018-09-17 15:02:211372ブラウズ

この記事では、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) の手順は次のとおりです。

1. x の型が未定義の場合、NaN を返します。 2. x の型が Null の場合は 0 を返し、x の型が true の場合は 1 を返し、

# の場合は 0 を返します。 ##4. x の型が数値の場合、x を返します。x の型が文字列の場合、この記事ではこの内容は紹介しません。詳細;

6. x の型がシンボルの場合は、NaN が返されます。 primValue の値は ToPrimitive(x, ヒント Number);

b. ToNumber(primValue) の結果を返します ;

[] == ![]

比較== 演算子の手順については上で説明しましたので、理解を深めるために例について説明します。

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)、つまり:

[] == ![] // => [] == false
ToNumber(x) のステップ 3 から、ToNumber(false) が 0 を返すことがわかります:

[] == false // => [] == ToNumber(false)
次に、x == y のステップ 9 に進みます。比較ステップを実行し、ToPrimitive(x) == y の比較結果を返します:

[] == ToNumber(false) // => [] == +0
ToPrimitive([]) の結果は空の文字列 "" です。理由を説明してください。記事の 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。