1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
|
---
title: Операторы сравнения
slug: >-
conflicting/Web/JavaScript/Reference/Operators_69135a8d5772f8b6e45265523df05d89
tags:
- JavaScript
- Операторы
translation_of: Web/JavaScript/Reference/Operators
translation_of_original: Web/JavaScript/Reference/Operators/Comparison_Operators
original_slug: Web/JavaScript/Reference/Operators/Операторы_сравнения
---
<div>{{jsSidebar("Operators")}}</div>
<p>В JavaScript имеются как строгие сравнения, так и сравнения с преобразованием типа операндов. Строгие сравнения (к примеру, ===) истинны только в том случае, если типы сравниваемых значений являются одинаковыми (к примеру: string-string, number-number). Однако, чаще используются сравнения с преобразованием типов (к примеру, ==). Такой тип сравнения, перед тем как непосредственно выполнить сравнение, приводит операнды к одному типу. В случае же абстрактного реляционного сравнения, операнды сперва преобразуются в примитивы, затем приводятся к одному типу, и только после этого сравниваются.</p>
<p>Строки сравниваются на основе стандартного лексикографического упорядочения, используя значения Unicode.</p>
<p>Особенности сравнений:</p>
<ul>
<li>Две строки строго равны только в том случае, если они имеют одинаковую длину, и те же символы в одинаковой последовательности и соответствующих позициях.</li>
<li>Два числа строго равны в том случае, если они численно равны. <a href="/ru/docs/Web/JavaScript/Reference/Global_Objects/NaN" title="NaN">NaN</a> не равно ничему, в том числе и NaN. Нули с положительным и отрицательным знаком равны.</li>
<li>Два логических значения (boolean) равны только в том случае, если они оба <code>истинны (true)</code> или <code>ложны (false</code>).</li>
<li>Два различных объекта никогда не равны как в строгих, так и в абстрактных сравнениях.</li>
<li>Сравнение объекта истинно лишь в том случае, если оба операнда ссылаются на один и тот же объект в памяти.</li>
<li>Виды <code>null</code> и <code>undefined</code> равны себе как в строгом сравнении, так и в абстрактном.</li>
</ul>
<p><strong>При использовании сравнения с преобразованием типов, следует быть крайне осторожным, так как это может привести к непредвиденным проблемам, связанным с особенностями конвертации различных типов (см. параграф "Использование операторов равенства").</strong></p>
<h2 id="Операторы_равенства">Операторы равенства</h2>
<h3 id="Равно"><a name="Equality">Равно (==)</a></h3>
<p><em>Оператор равно</em> сначала приводит операнды к одному типу, и затем применяет строгое сравнение. Если оба операнда являются объектами, то JavaScript сравнивает внутренние ссылки, которые равны в том случае, если они ссылаются на один и тот же объект в памяти.</p>
<h4 id="Синтаксис">Синтаксис</h4>
<pre class="syntaxbox notranslate">x == y
</pre>
<h4 id="Примеры">Примеры</h4>
<pre class="brush: js notranslate"> 1 == 1 // истина
"1" == 1 // истина
1 == '1' // истина
3 == 5 // ложь
0 == false // истина
"foo" == "bar" // ложь
</pre>
<h3 id="Не_равно_!"><a name="Inequality">Не равно (!=)</a></h3>
<p><em>Оператор не равно</em> возвращает <code>true</code> в том случае, если операнды не равны.<em>Он </em>аналогичен оператору равенства, перед сравнением приводит операнды к одному типу. В случае если оба операнда являются объектами, JavaScript сравнивает внутренние ссылки, которые не равны в том случае, если относятся к разным объектам в памяти.</p>
<h4 id="Синтаксис_2">Синтаксис</h4>
<pre class="syntaxbox notranslate">x != y</pre>
<h4 id="Примеры_2">Примеры</h4>
<pre class="brush: js notranslate">1 != 2 // истина
1 != "1" // ложь
1 != '1' // ложь
1 != true // ложь
0 != false // ложь
"foo" != "bar" // истина
</pre>
<h3 id="Строго_равно"><a name="Identity">Строго равно (===)</a></h3>
<p>Оператор возвращает истину в том случае, если операнды строго равны (см. выше). В отличие от <em>оператора равно</em>, данный оператор <strong>не приводит операнды к одному типу.</strong></p>
<h4 id="Синтаксис_3">Синтаксис</h4>
<pre class="syntaxbox notranslate">x === y</pre>
<h4 id="Примеры_3">Примеры</h4>
<pre class="brush: js notranslate">3 === 3 // истина
3 === '3' // ложь
'foo' === 'foo' // истина
</pre>
<h3 id="Строго_не_равно_!"><a name="Nonidentity">Строго не равно (!==)</a></h3>
<p><em>Оператор строго не равно </em>возвращает истину в том случае, <strong>если операнды не равны, или их типы отличаются друг от друга.</strong></p>
<h4 id="Синтаксис_4">Синтаксис</h4>
<pre class="syntaxbox notranslate">x !== y</pre>
<h4 id="Примеры_4">Примеры</h4>
<pre class="brush: js notranslate">3 !== '3' // истина
4 !== 3 // истина
</pre>
<h2 id="Операторы_сравнения">Операторы сравнения</h2>
<h3 id="Больше_>"><a name="Greater_than_operator">Больше (>)</a></h3>
<p><em>Оператор больше</em> возвращает истину в том случае, если значение левого операнда больше, чем правого.</p>
<h4 id="Синтаксис_5">Синтаксис</h4>
<pre class="syntaxbox notranslate">x > y</pre>
<h4 id="Примеры_5">Примеры</h4>
<pre class="brush: js notranslate">4 > 3 // истина
1 > 5 // ложь
</pre>
<h3 id="Больше_или_равно_>"><a name="Greater_than_or_equal_operator">Больше или равно (>=)</a></h3>
<p><em>Оператор больше или равно, </em>возвращает истину в том случае, если значение операнда слева больше или равно значению операнда справа.</p>
<h4 id="Синтаксис_6">Синтаксис</h4>
<pre class="syntaxbox notranslate"> x >= y</pre>
<h4 id="Примеры_6">Примеры</h4>
<pre class="brush: js notranslate">4 >= 3 // истина
3 >= 3 // истина
</pre>
<h3 id="Меньше<"><a name="Less_than_operator">Меньше(<)</a></h3>
<p><em>Оператор меньше, </em>возвращает истину в том случае, если значение операнда слева меньше, чем значение операнда справа.</p>
<h4 id="Синтаксис_7">Синтаксис</h4>
<pre class="syntaxbox notranslate"> x < y</pre>
<h4 id="Примеры_7">Примеры</h4>
<pre class="brush: js notranslate">3 < 4 // истина
5 < 2 // ложь
</pre>
<h3 id="Меньше_или_равно_<"><a id="Less_than_or_equal_operator" name="Less_than_or_equal_operator">Меньше или равно (<=)</a></h3>
<p><em>Оператор меньше или равно, </em>возвращает истину в том случае, если значение операнда слева меньше, или равно значению операнда справа.</p>
<h4 id="Синтаксис_8">Синтаксис</h4>
<pre class="syntaxbox notranslate"> x <= y</pre>
<h4 id="Примеры_8">Примеры</h4>
<pre class="brush: js notranslate">3 <= 4 // истина
3 <= 3 // истина
</pre>
<h2 id="Использование_операторов_равенства">Использование операторов равенства</h2>
<p>Стандартные операции равенства с преобразованием типов (<code>==</code> и <code>!=</code>) используют <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3">Абстрактный Алгоритм Эквивалентного Сравнения</a> для сравнения двух операндов. Если у операндов различные типы, то JavaScript пытается привести их к одному типу, перед тем как сравнивать их. К примеру, в выражении <code>5 == '5'</code>, строка справа конвертируется в число, и только потом сравнивается.</p>
<p><em>Операторы строгого равентсва</em> (<code>===</code> и <code>!==</code>) используют Строгий Алгоритм Эквивалентного Сравнения, и предназначены для сравнения операндов одного типа. <strong>Если операнды имеют разные типы, то результат операции сравнения всегда будет ложью.</strong> К примеру, выражение <code>5 !== '5'</code> будет истинным.</p>
<p>Используйте <em>операторы строгого равенства</em> в тех случаях, когда необходимо проверять не только значения операндов, но так же и их типы. Во противном случае, используйте операторы стандартного равенства, которые позволяют сравнить два операнда вне зависимости от их типов.</p>
<p>Когда происходит преобразование типов (т.е в случаях использования нестрогого сравнения), JavaScript преобразует типы String, Number, Boolean и Object, следующим образом:</p>
<ul>
<li>При сравнении числа <code>(Number)</code> и строки <code>(String)</code>, JavaScript пытается преобразовать числовой литерал строки в число. Затем полученное число округляется до ближайшего возможного значения типа <code>Number</code>.</li>
<li>Если один из операндов является логическим <code>(Boolean)</code>, то он преобразуется в значение типа <code>(Number)</code>. <strong>Если значение логического операнда равняется истине <code>(true)</code>, то значение этого операнда преобразуется в 1. Иначе - в 0 <code>(ложь / false)</code>.</strong></li>
<li>Если объект сравнивается с числом или строкой, JavaScript пытается получить значение по умолчанию для данного объекта. Полученное значение преобразуется в примитив, посредством методов <strong><code>valueOf()</code></strong> и <strong><code>toString()</code></strong>. Если преобразовать объект не удается, генерируется ошибка времени выполнения.</li>
<li>Обратите внимание на то, что объект преобразуется в примитив, если, и только если, второй операнд является примитивом. В ином случае, операнды сравниваются как объекты, соответственно, операция сравнения вернет истину в том случае, если внутренние ссылки обоих объектов ссылаются на один и тот же объект в памяти.</li>
</ul>
<div class="note"><strong>Внимание:</strong> Объекты String имеют тип Object, а не String. Такие объекты используются редко, так что следующий код может вас сильно удивить.</div>
<pre class="brush:js notranslate">// Истина, так как оба операнда имеют тип String
'foo' === 'foo'
var a = new String('foo');
var b = new String('foo');
// Ложь, так как операнды являются объектами, внутренние ссылки которых, ссылаются на разные объекты в памяти
a == b
// Ложь, так как операнды являются объектами, внутренние ссылки которых, ссылаются на разные объекты в памяти
a === b
// Истина, так как объект a (String) будет преобразован в строку 'foo', перед сопоставлением
a == 'foo' </pre>
<h2 id="Спецификации">Спецификации</h2>
<table class="standard-table">
<tbody>
<tr>
<th scope="col">Спецификация</th>
<th scope="col">Статус</th>
<th scope="col">Комментарий</th>
</tr>
<tr>
<td>{{SpecName('ES1')}}</td>
<td>{{Spec2('ES1')}}</td>
<td>Появление в спецификации. Выполняется в JavaScript 1.0</td>
</tr>
<tr>
<td>{{SpecName('ES3')}}</td>
<td>{{Spec2('ES3')}}</td>
<td>Добавлены операторы <code>===</code> и <code>!==</code>. Выполняется в JavaScript 1.3</td>
</tr>
<tr>
<td>{{SpecName('ES5.1', '#sec-11.8')}}</td>
<td>{{Spec2('ES5.1')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.8">Относительные операторы</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9">Операторы равенства</a></td>
</tr>
<tr>
<td>{{SpecName('ES6', '#sec-relational-operators')}}</td>
<td>{{Spec2('ES6')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.8">Относительные операторы</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9">Операторы равенства</a></td>
</tr>
<tr>
<td>{{SpecName('ESDraft', '#sec-relational-operators')}}</td>
<td>{{Spec2('ESDraft')}}</td>
<td>Определено в нескольких секциях спецификации: <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.8">Относительные операторы</a>, <a href="http://www.ecma-international.org/ecma-262/5.1/#sec-11.9">Операторы равенства</a></td>
</tr>
</tbody>
</table>
<h2 id="Поддержка_браузерами">Поддержка браузерами</h2>
<p>{{CompatibilityTable}}</p>
<div id="compat-desktop">
<table class="compat-table">
<tbody>
<tr>
<th></th>
<th>Chrome</th>
<th>Firefox (Gecko)</th>
<th>Internet Explorer</th>
<th>Opera</th>
<th>Safari</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>
<p>{{CompatVersionUnknown}}</p>
</td>
</tr>
</tbody>
</table>
</div>
<div id="compat-mobile">
<table class="compat-table" style="height: 73px; width: 1078px;">
<tbody>
<tr>
<th></th>
<th>Android</th>
<th>Chrome for Android</th>
<th>Firefox Mobile (Gecko)</th>
<th>IE Mobile</th>
<th>Opera Mobile</th>
<th>Safari Mobile</th>
</tr>
<tr>
<td>Базовая поддержка</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
<td>{{CompatVersionUnknown}}</td>
</tr>
</tbody>
</table>
</div>
<h2 id="Смотрите_также"><br>
Смотрите также</h2>
<ul>
<li>{{jsxref("Object.is()")}}</li>
<li><a href="/ru/docs/Web/JavaScript/Equality_comparisons_and_sameness">Операторы сравнения и одинаковость</a></li>
</ul>
|