Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung des Inhalts von ==, === und Object.js() in js (umfassend)

Detaillierte Erläuterung des Inhalts von ==, === und Object.js() in js (umfassend)

不言
不言Original
2018-09-17 15:02:211391Durchsuche

Dieser Artikel bietet Ihnen eine detaillierte Erklärung von ==, === und Object.js() (umfassend). Ich hoffe, dass er Ihnen helfen wird.

In diesem Artikel werden hauptsächlich die drei Gleichheitsoperationen in JavaScript erläutert: ==, === und Object.js(). Vertiefen Sie den Eindruck aller durch Vergleiche und Beispiele und erläutern Sie einzelne Beispiele ausführlich.

Vorkenntnisse

Detaillierte Erläuterung der Kenntnisse der abstrakten ToPrimitive-Operation in der ECMAScript7-Spezifikation (Beispiel)

=== Operator

Für x === y sind die Vergleichsschritte dieses Operators wie folgt:

1 Wenn sich der Typ von x vom Typ von y unterscheidet, wird „false“ zurückgegeben. Wenn der Typ von x eine Zahl ist, dann:

a Wenn x NaN ist, gib „false“ zurück; . Wenn x und y der gleiche numerische Wert sind, wird „true“ zurückgegeben. Wenn x +0 und y „-0“ ist, wird „true“ zurückgegeben y ist +0, gibt true zurück; f. Gibt das Ergebnis von SameValueNonNumber(x, y) zurück.

SameValueNonNumber(x, y) abstrakte Operation vergleicht zwei Nichtzahlen und ob x und y vom gleichen Typ sind. Die Vergleichsschritte sind wie folgt:

1 x ist null oder undefiniert. Geben Sie „true“ zurück 🎜>

3, wenn x ein boolescher Typ ist,

4 Wenn x und y beide wahr oder falsch sind, geben Sie true zurück, andernfalls geben Sie false zurück; ein Symboltyp,

Wenn x und y der gleiche Symbolwert sind, geben Sie „true“ zurück, andernfalls geben Sie „false“ zurück.

6 Wenn x und y der gleiche Objektwert sind, geben Sie „true“ zurück FALSCH.

Die zu beachtenden Punkte sind NaN, +0, -0:

NaN === NaN // false
+0 === -0 // true
-0 === +0 // true
Diese drei Beispiele entsprechen 2,1, 2,4 und 2,5 im x === y-Vergleichsschritt. Die Ausgabeergebnisse dieser drei Beispiele stimmen vollständig mit den Definitionen der Spezifikationen überein. Es gibt keinen Grund, so sind die Spezifikationen definiert. Warum die Spezifikation auf diese Weise definiert ist, müssen Sie möglicherweise bei den Erstellern der Spezifikation erfragen, was den Rahmen dieses Artikels sprengen würde.

Object.is()

Für Object.is(x, y) wird die abstrakte Operation SameValue(x, y) zum Vergleich verwendet. Die Schritte dieser abstrakten Operation sind wie folgt folgt:

1. Wenn sich der Typ von x vom Typ von y unterscheidet, wird „false“ zurückgegeben.

2 Wenn der Typ von x eine Zahl ist, dann:

a. Wenn x und y NaN sind, wird „true“ zurückgegeben. b Wenn x +0 und y „-0“ ist, wird „false“ zurückgegeben y ist +0, gibt false zurück; wenn x und y den gleichen numerischen Wert haben, wird true zurückgegeben Ergebnis von SameValueNonNumber(x, y).

Es ist ersichtlich, dass der Unterschied zwischen === und Object.is() in der Verarbeitung von NaN und signierter 0 liegt:

NaN === NaN // false
+0 === -0 // true
-0 === +0 // true
Object.is(NaN, NaN) // true
Object.is(+0, -0) // false
Object.is(-0, +0) // false
== Operator

für x == y, die Vergleichsschritte dieses Operators sind wie folgt:

1 Wenn x und y vom gleichen Typ sind, wird das Ergebnis von x === y zurückgegeben . Wenn x null ist, y undefiniert ist, gib „true“ zurück. Wenn x undefiniert und y null ist, gib „true“ zurück Der Typ von y ist eine Zeichenfolge. Geben Sie das Ergebnis von x zurück (x) == y;

6. Wenn der Typ von x ein boolescher Typ ist, wird das Ergebnis von ToNumber(x) == y zurückgegeben ist ein boolescher Typ, gib das Ergebnis von x zurück of x == ToPrimitive(y) wird zurückgegeben; der Typ ist ein Objekt und der Typ von y ist einer von string, number oder Symbol. Das Ergebnis von ToPrimitive(x) == y wird zurückgegeben; >10. Rückgabe falsch.

Die Methode ToNumber(x) ist wie folgt:

1 Wenn der Typ von x Undefiniert ist, geben Sie NaN zurück . Wenn der Typ von x Null ist, geben Sie +0 zurück. Wenn der Typ von x ein boolescher Typ ist, geben Sie 1 zurück, wenn x wahr ist, und +0, wenn er falsch ist 4. Wenn der Typ von x ist; 5. Wenn der Typ von x eine Zeichenfolge ist, wird dieser Artikel nicht im Detail vorgestellt 6. Wenn der Typ von x ein Symbol ist, wird NaN zurückgegeben ;

7 Wenn der Typ von x ein Objekt ist,

a , Hinweis Nummer);

b. Das Ergebnis von [] auf der linken Seite ist ein leeres Array, der Typ ist Objekt und auf der rechten Seite ist ![], [] ein wahrer Wert , also ist das Ergebnis von ![] falsch:

[] == ![]
und dann geht es zu x == y. Schritt 7 des Vergleichsschritts gibt das Ergebnis von x == ToNumber(y) zurück, das heißt:

[] == ![] // => [] == false
Aus Schritt 3 von ToNumber(x) ist ersichtlich, dass ToNumber(false) +0 zurückgibt:

[] == false // => [] == ToNumber(false)
Gehen Sie dann zu Schritt 9 des x == y-Vergleichsschritts und kehren Sie zurück das Vergleichsergebnis von ToPrimitive(x) == y:

[] == ToNumber(false) // => [] == +0
Das Ergebnis von ToPrimitive([]) ist die leere Zeichenfolge „“. Gründe finden Sie im Artikel „Abstrakte ToPrimitive-Operation“ in der ECMAScript7-Spezifikation. Daher ist das Obige äquivalent zu:

[] == +0 // => ToPrimitive([]) == +0
Fahren Sie dann mit Schritt 5 des x == y-Vergleichsschritts fort und geben Sie das Ergebnis von ToNumber(x) == y zurück:

"" == +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(),希望对大家有所帮助。

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Inhalts von ==, === und Object.js() in js (umfassend). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn