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

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

不言
Freigeben: 2018-09-17 15:02:21
Original
1420 Leute haben es durchsucht

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
Nach dem Login kopieren
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
Nach dem Login kopieren
== 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:

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

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

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

[] == ToNumber(false) // => [] == +0
Nach dem Login kopieren
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
Nach dem Login kopieren
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
Nach dem Login kopieren

由ToNumber操作的第5步可知,ToNumber("")的结果是+0,所以也就是:

+0 == +0 // true
Nach dem Login kopieren

{} == !{}

首先,左边是{},类型是对象,右边是!{},{}是真值,所以!{}是false:

{} == !{} // => {} == false
Nach dem Login kopieren

然后同样会走到x == y比较步骤的第7步,返回x == ToNumber(y)的结果,也就是:

{} == false // => {} == ToNumber(false)
Nach dem Login kopieren

由ToNumber(x)的第3步可知,ToNumber(false)返回+0:

{} == ToNumber(false) // => {} == +0
Nach dem Login kopieren

然后走到x == y比较步骤的第9步,返回ToPrimitive(x) == y的比较结果:

{} == +0 // => ToPrimitive({}) == +0
Nach dem Login kopieren

ToPrimitive({})的结果是字符串"[object Object]",原因请查看文章ECMAScript7规范中的ToPrimitive抽象操作。所以,上面等价于:

"[object Object]" == +0
Nach dem Login kopieren

然后走到x == y比较步骤的第5步,返回ToNumber(x) == y的结果:

"[object Object]" == +0 // => ToNumber("[object Object]") == +0
Nach dem Login kopieren

由ToNumber操作的第5步可知,ToNumber("[object Object]")的结果是NaN,所以也就是:

NaN == +0 // false
Nach dem Login kopieren

所以,[] == ![]的结果是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!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage